diff --git a/gatsby-node.js b/gatsby-node.js index 3cb3567e4..a4566688b 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -6,6 +6,62 @@ const { } = require('./src/configs/doc-configs'); const { getDocLinkFromEdge } = require('./src/utils/gatsby-utils.js'); +/* ── Build-time Markdown generation ─────────────────────────────────────── + * For every asciidoc node, convert the already-generated HTML to clean + * Markdown using cheerio (DOM pre-processing) + turndown (HTML→MD). + * The result is stored as `fields.markdownBody` on each node and exposed + * in GraphQL so CopyPageDropdown can use it instead of scraping the DOM. + */ +exports.onCreateNode = ({ node, actions }) => { + if (node.internal.type !== 'Asciidoc') return; + + const { createNodeField } = actions; + const TurndownService = require('turndown'); + const cheerio = require('cheerio'); + + const html = node.html || ''; + const title = node.document?.title || node.pageAttributes?.title || ''; + + /* Load HTML into cheerio for pre-processing */ + const $ = cheerio.load(html, { decodeEntities: false }); + + /* Remove anchor icon links that Asciidoctor injects next to headings */ + $('a.anchor').remove(); + + /* Remove the embedded TOC — it adds noise to Markdown */ + $('#toc').remove(); + + /* Convert admonition tables to readable text blocks */ + $('.admonitionblock').each((_, el) => { + const type = $(el).attr('class').match(/\b(note|tip|warning|caution|important)\b/i)?.[1]?.toUpperCase() || 'NOTE'; + const content = $(el).find('td.content').text().trim(); + $(el).replaceWith(`
`); + }); + + /* Get the cleaned HTML */ + const cleanedHtml = $('body').html() || ''; + + /* Configure turndown */ + const td = new TurndownService({ + headingStyle: 'atx', + bulletListMarker: '-', + codeBlockStyle: 'fenced', + fence: '```', + }); + + /* GFM table plugin — renders tables as proper Markdown pipe tables */ + const { tables } = require('turndown-plugin-gfm'); + td.use(tables); + + const markdownBody = td.turndown(cleanedHtml); + + createNodeField({ + node, + name: 'markdownBody', + value: markdownBody, + }); +}; + exports.onPostBuild = () => { fsExtra.copyFileSync( `${__dirname}/robots.txt`, @@ -39,12 +95,23 @@ exports.createPages = async function ({ actions, graphql }) { `); const namePageIdMap = {}; + // Collect per-category nav HTMLs keyed by category name (pageid minus 'nav-' prefix) + const navMap = {}; + const NAV_PARTIAL_PREFIX = 'nav-'; + data.allAsciidoc.edges.forEach((e) => { const { sourceInstanceName: sourceName, relativePath: relPath, } = e.node.parent; const pageId = e.node.pageAttributes.pageid; + + // Collect nav-* files into the navMap (not content pages) + if (pageId && pageId.startsWith(NAV_PARTIAL_PREFIX)) { + navMap[pageId.slice(NAV_PARTIAL_PREFIX.length)] = e.node.html; + return; + } + if (sourceName === 'tutorials') { const relPathSplit = relPath.split('/'); const pageIdSplit = pageId.split('__'); @@ -66,13 +133,16 @@ exports.createPages = async function ({ actions, graphql }) { data.allAsciidoc.edges.forEach((edge) => { const { pageid: pageId } = edge.node.pageAttributes; + // Skip nav partial files — they are sidebar data, not content pages + if (pageId && pageId.startsWith(NAV_PARTIAL_PREFIX)) return; + const docPath = getDocLinkFromEdge(edge); actions.createPage({ path: docPath, component: require.resolve( './src/components/DevDocTemplate/index.tsx', ), - context: { pageId, navId: DOC_NAV_PAGE_ID, namePageIdMap }, + context: { pageId, navId: DOC_NAV_PAGE_ID, navMap, namePageIdMap }, }); if (pageId === 'introduction') { @@ -81,7 +151,7 @@ exports.createPages = async function ({ actions, graphql }) { component: require.resolve( './src/components/DevDocTemplate/index.tsx', ), - context: { pageId, navId: DOC_NAV_PAGE_ID, namePageIdMap }, + context: { pageId, navId: DOC_NAV_PAGE_ID, navMap, namePageIdMap }, }); } }); diff --git a/modules/ROOT/pages/ai-integration-options.adoc b/modules/ROOT/pages/ai-integration-options.adoc index 5e67530b7..ec760fd73 100644 --- a/modules/ROOT/pages/ai-integration-options.adoc +++ b/modules/ROOT/pages/ai-integration-options.adoc @@ -1,4 +1,4 @@ -= ThoughtSpot AI analytics integration += AI analytics integration :toc: true :toclevels: 3 diff --git a/modules/ROOT/pages/common/nav-embedding.adoc b/modules/ROOT/pages/common/nav-embedding.adoc new file mode 100644 index 000000000..e3f9a617d --- /dev/null +++ b/modules/ROOT/pages/common/nav-embedding.adoc @@ -0,0 +1,177 @@ + +:page-pageid: nav-embedding +:page-description: Embedding navigation + +[navSection] + +[.sidebar-title] +Embed ThoughtSpot in a web app + +* link:{{navprefix}}/getting-started[Embed with Visual Embed SDK] +* link:{{navprefix}}/tsembed[Quickstart guide] +* link:{{navprefix}}/embed-ai-search-analytics[Embed AI Search and Analytics] +** link:{{navprefix}}/embed-spotter[Embed Spotter experience] +** link:{{navprefix}}/embed-spotter-agent[Embed Spotter Agent] +* link:{{navprefix}}/embed-liveboard[Embed Analytics] +** link:{{navprefix}}/embed-liveboard[Embed a Liveboard] +** link:{{navprefix}}/embed-a-viz[Embed a visualization] +* link:{{navprefix}}/full-embed[Embed full application] +** link:{{navprefix}}/full-app-customize[Customize your embed] +** link:{{navprefix}}/customize-nav-controls[Customize navigation panels] +** link:{{navprefix}}/set-default-page[Customize default page and navigation path] +** link:{{navprefix}}/customize-homepage-experience[Customize home page experience] +* Embed token-based Search +** link:{{navprefix}}/search-embed[Embed Search] +** link:{{navprefix}}/embed-searchbar[Embed search bar] +* link:{{navprefix}}/react-app-embed[Embed with React components] + +[.sidebar-title] +Embed ThoughtSpot in a mobile app + +* link:{{navprefix}}/mobile-embed[Overview] +* link:{{navprefix}}/embed-ts-mobile-react-native[React Native SDK] +* link:{{navprefix}}/embed-ts-flutter[Flutter embed SDK] +* link:{{navprefix}}/embed-ts-swift[Swift Embed SDK] +* link:{{navprefix}}/embed-ts-android[Android Embed SDK] + +[.sidebar-title] +Embed without SDK + +** link:{{navprefix}}/embed-without-sdk[Embed without SDK] +** link:{{navprefix}}/custom-viz-rest-api[Create a custom visualization] + +[.sidebar-title] +Customize and integrate + +* link:{{navprefix}}/style-customization[Customize UI layout and styles] +** link:{{navprefix}}/customize-style[Customize basic styles] +** link:{{navprefix}}/custom-css[CSS customization framework] +** link:{{navprefix}}/theme-builder-doc[Theme builder] +** link:{{navprefix}}/customize-icons[Customize icons] +** link:{{navprefix}}/customize-text[Customize text strings] +** link:{{navprefix}}/css-variables-reference[CSS variables reference] + +* link:{{navprefix}}/filters-overview[Filters overview] +** link:{{navprefix}}/runtime-overrides[Runtime overrides] +** link:{{navprefix}}/runtime-filters[Runtime filters] +** link:{{navprefix}}/runtime-params[Runtime Parameters] +* link:{{navprefix}}/action-config[Customize menus] +** link:{{navprefix}}/actions[Action IDs in the SDK] +* link:{{navprefix}}/events-app-integration[Events and app interactions] +** link:{{navprefix}}/embed-events[Using embed events] +** link:{{navprefix}}/host-events[Using host events] +** link:{{navprefix}}/context-aware-event-routing[Context-based execution of host events] +** link:{{navprefix}}/hostEventsV2-migration[Migrating from Host Event v1 to Host Events v2 framework] +** link:{{navprefix}}/api-search-intercept[API intercept and data fetch requests] + +* link:{{navprefix}}/custom-action-intro[Custom actions] +** link:{{navprefix}}/customize-actions[Custom actions through the UI] +*** link:{{navprefix}}/custom-action-url[URL actions] +*** link:{{navprefix}}/custom-action-callback[Callback actions] +*** link:{{navprefix}}/edit-custom-action[Set the position of a custom action] +*** link:{{navprefix}}/add-action-viz[Add a local action to a visualization] +*** link:{{navprefix}}/add-action-worksheet[Add a local action to a model] +** link:{{navprefix}}/code-based-custom-action[Code based custom actions] +** link:{{navprefix}}/custom-action-payload[Callback response payload] + +* link:{{navprefix}}/customize-links[Customize links] +* link:{{navprefix}}/set-locale[Customize locale] +* link:{{navprefix}}/custom-domain-config[Custom domain configuration] +* link:{{navprefix}}/customize-emails[Customize onboarding settings] +* link:{{navprefix}}/customize-email-apis[Customize email template] +* link:{{navprefix}}/in-app-navigation[Create dynamic menus and navigation] +* link:{{navprefix}}/best-practices[Performance optimization] +** link:{{navprefix}}/best-practices[Best practices] +** link:{{navprefix}}/prerender[Prerender components] +** link:{{navprefix}}/lazy-load-fullHeight[Full height and lazy loading options] +** link:{{navprefix}}/prefetch[Prefetch static resources] +* link:{{navprefix}}/troubleshoot-errors[Troubleshoot errors] + +[.sidebar-title] +Authentication and data security + +* link:{{navprefix}}/embed-auth[Authentication] +** link:{{navprefix}}/trusted-auth[Trusted authentication] +*** link:{{navprefix}}/trusted-auth-secret-key[Secret key management] +*** link:{{navprefix}}/trusted-auth-sdk[Front-end trusted authentication integration] +*** link:{{navprefix}}/trusted-auth-token-request-service[Token request service] +*** link:{{navprefix}}/trusted-auth-troubleshoot[Troubleshoot trusted authentication] +** link:{{navprefix}}/saml-sso[SAML SSO authentication] +** link:{{navprefix}}/oidc-auth[OpenID Connect authentication] +** link:{{navprefix}}/just-in-time-provisioning[Just-in-time provisioning] +* link:{{navprefix}}/security-settings[Security settings] + +* link:{{navprefix}}/embed-object-access[Authorization] +** link:{{navprefix}}/access-control-sharing[Access control and sharing] +** link:{{navprefix}}/privileges-and-roles[Privileges and Roles] +** link:{{navprefix}}/data-security[Data security] +*** link:{{navprefix}}/rls-rules[RLS Rules] +*** link:{{navprefix}}/abac-via-rls-variables[ABAC via RLS with variables] +*** link:{{navprefix}}/jwt-abac-migration-guide[ABAC JWT migration guide] +**** link:{{navprefix}}/jwt-filter-parameters-rules-migration-guide[JWT ABAC with filter rules -> ABAC via RLS] +**** link:{{navprefix}}/jwt-abac-beta-migration-guide[JWT ABAC beta implementation -> ABAC via RLS] +*** link:{{navprefix}}/abac-user-parameters[ABAC via JWT with filter rules and parameters] +* link:{{navprefix}}/selective-user-access[User access] +* link:{{navprefix}}/troubleshoot-errors[Troubleshoot errors] + +[.sidebar-title] +Authentication and data security + +* link:{{navprefix}}/tutorials/tutorials-overview[Embedding tutorials] +* link:{{navprefix}}/tutorials/tse-fundamentals/intro[Embedding Fundamentals] +** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-01[01 - Overview] +** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-02[02 - Set up for course] +** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-03[03 - Security setup] +** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-04[04 - Start coding] +** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-05[05 - Embed Search] +** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-06[06 - Embed Natural Language Search] +** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-07[07 - Embed Liveboard] +** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-08[08 - Embed Visualization] +** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-09[09 - Embed full application] +** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-10[10 - Style embedded app] +** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-11[11 - Course summary] +** link:{{navprefix}}/tutorials/style-customization/tutorial[Style customization] +* link:{{navprefix}}/tutorials/react-components/intro[React components] +** link:{{navprefix}}/tutorials/react-components/lesson-01[01 - Initialize Visual Embed SDK] +** link:{{navprefix}}/tutorials/react-components/lesson-02[02 - ThoughtSpot component pages] +** link:{{navprefix}}/tutorials/react-components/lesson-03[03 - Menus and navigation elements] +** link:{{navprefix}}/tutorials/react-components/lesson-04[04 - Event handling] + + +[.sidebar-title] +Reference guides and changelog + +* +++Visual Embed Playground+++ +* link:{{navprefix}}/VisualEmbedSdk[Visual Embed SDK Reference] +include::generated/typedoc/CustomSideNav.adoc[] +** Custom styles +*** [.typedoc-Interface]#link:{{navprefix}}/Interface_CustomStyles[CustomStyles]# +*** [.typedoc-Interface]#link:{{navprefix}}/Interface_CustomisationsInterface[CustomisationsInterface]# +*** [.typedoc-Interface]#link:{{navprefix}}/Interface_customCssInterface[customCssInterface]# +*** [.typedoc-Interface]#link:{{navprefix}}/Interface_CustomCssVariables[customCssVariables]# +** Runtime filters +*** [.typedoc-Interface]#link:{{navprefix}}/Interface_RuntimeFilter[RuntimeFilter]# +*** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_RuntimeFilterOp[RuntimeFilterOp]# +** Others +*** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_Action[Action]# +*** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_ContextMenuTriggerOptions[ContextMenuTriggerOptions]# +*** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_DataSourceVisualMode[DataSourceVisualMode]# +*** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_Page[Page]# +*** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_PrefetchFeatures[PrefetchFeatures]# +*** [.typedoc-Function]#link:{{navprefix}}/Function_executeTML[executeTML]# +*** [.typedoc-Function]#link:{{navprefix}}/Function_exportTML[exportTML]# +* link:{{navprefix}}/embed-sdk-changelog[Changelog] +** link:{{navprefix}}/embed-sdk-changelog[Visual Embed SDK] +** link:{{navprefix}}/mobile-sdk-changelog[Mobile Embed SDK] + +[.sidebar-title] +Additional resources + +* link:{{navprefix}}/embed-ts[About ThoughtSpot embedding] +* link:{{navprefix}}/get-started-tse[Embed licenses] +* link:{{navprefix}}/license-feature-matrix[Feature matrix] +* link:{{navprefix}}/faqs[FAQs] +* link:{{navprefix}}/code-samples[Code samples] +* link:https://codesandbox.io/s/big-tse-react-demo-i4g9xi[React CodeSandbox, window=_blank] +* link:https://codesandbox.io/s/graphqlcookieembed-wf4fk9?file=/src/App.js:418-426[GraphQL CodeSandbox, window=_blank] + diff --git a/modules/ROOT/pages/common/nav-mcp-server.adoc b/modules/ROOT/pages/common/nav-mcp-server.adoc new file mode 100644 index 000000000..d40f131d7 --- /dev/null +++ b/modules/ROOT/pages/common/nav-mcp-server.adoc @@ -0,0 +1,32 @@ + +:page-pageid: nav-mcp-server +:page-description: MCP Server navigation + +[navSection] + +[.sidebar-title] +ThoughtSpot 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}}/custom-chatbot-integration-mcp[Integrating MCP Server in a custom app] + +[.sidebar-title] +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)] + +[.sidebar-title] +Related SDK components + +* [.typedoc-Function]#link:{{navprefix}}/Function_startAutoMCPFrameRenderer[startAutoMCPFrameRenderer]# +* [.typedoc-Interface]#link:{{navprefix}}/Interface_AutoMCPFrameRendererViewConfig[AutoMCPFrameRendererViewConfig]# + +[.sidebar-title] +MCP Server release notes + +* link:{{navprefix}}/mcp-server-changelog[MCP Server changelog] diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc new file mode 100644 index 000000000..a9fec3165 --- /dev/null +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -0,0 +1,96 @@ + +:page-pageid: nav-rest-api +:page-description: REST API navigation + +[navSection] + +[.sidebar-title] +REST APIs + +* link:{{navprefix}}/rest-apis[Overview] +* link:{{navprefix}}/rest-apiv2-getstarted[Get started] +* link:{{navprefix}}/api-authv2[REST API v2.0 authentication] +* link:{{navprefix}}/rest-v2-changelog[REST API v2 changelog] +* link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fgetting-started%2Fintroduction[REST API v2 Playground] +* link:{{navprefix}}/rest-apiv2-reference[REST API v2.0 Reference] +** link:{{navprefix}}/api-user-management[Users and group privileges] +** link:{{navprefix}}/rbac[Role-based access control] +** link:{{navprefix}}/rest-apiv2-search[Search API endpoints] +*** link:{{navprefix}}/rest-apiv2-users-search[Search users] +*** link:{{navprefix}}/rest-apiv2-groups-search[Search groups] +*** link:{{navprefix}}/rest-apiv2-metadata-search[Search metadata] +** link:{{navprefix}}/fetch-data-and-report-apis[Data and Report APIs] +** link:{{navprefix}}/spotter-api[Spotter APIs] +*** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] +*** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] +*** link:{{navprefix}}/spotter-coaching-apis[Spotter coaching APIs ^BETA^] +** link:{{navprefix}}/audit-logs[Audit logs] +** link:{{navprefix}}/tml[TML] +** link:{{navprefix}}/collections[Collections ^BETA^] +** link:{{navprefix}}/connections[Connections] +** link:{{navprefix}}/connection-config[Connection configuration] +** link:{{navprefix}}/runtime-sort[Runtime sorting] + + +[.sidebar-title] +REST API SDK + +* link:{{navprefix}}/rest-api-sdk[Overview] +* link:{{navprefix}}/rest-api-sdk-typescript[TypeScript SDK] +* link:{{navprefix}}/rest-api-sdk-java[Java SDK] +* link:{{navprefix}}/rest-apiv2-js[REST API v2.0 in JavaScript] + +[.sidebar-title] +Webhooks + +* link:{{navprefix}}/webhooks[Overview] +* link:{{navprefix}}/webhooks-comm-channel[Configure and monitor webhook communication channels] +* link:{{navprefix}}/webhooks-s3-integration[Deliver Liveboard reports to AWS S3 Storage] +* link:{{navprefix}}/webhooks-lb-schedule[Deliver Liveboard reports to external application] +* link:{{navprefix}}/webhooks-lb-payload[Webhook response payload] +* link:{{navprefix}}/webhooks-kpi[Webhook for KPI alerts] + +[.sidebar-title] +REST API Tutorials + +* link:{{navprefix}}/tutorials/rest-api/intro[REST API Tutorials] +* link:{{navprefix}}/tutorials/rest-api/lesson-01[01 - REST API overview] +* link:{{navprefix}}/tutorials/rest-api/lesson-02[02 - Simple Python implementation] +* link:{{navprefix}}/tutorials/rest-api/lesson-03[03 - Complex REST API workflows] + +[.sidebar-title] +REST API v1 (DEPRECATED) + +* link:{{navprefix}}/rest-api-getstarted[Get started] +* link:{{navprefix}}/api-auth-session[REST API v1 authentication] +* link:{{navprefix}}/catalog-and-audit[Catalog and audit content] +* link:{{navprefix}}/rest-api-pagination[Paginate API response] +* link:{{navprefix}}/rest-api-reference[REST API v1 Reference] +** link:{{navprefix}}/orgs-api[Orgs API] +** link:{{navprefix}}/user-api[User API] +** link:{{navprefix}}/group-api[Group API] +** link:{{navprefix}}/role-api[Role API] +** link:{{navprefix}}/session-api[Session API] +** link:{{navprefix}}/connections-api[Data connection API] +** link:{{navprefix}}/metadata-api[Metadata API] +** link:{{navprefix}}/admin-api[Admin API] +** link:{{navprefix}}/tml-api[TML API] +** link:{{navprefix}}/dependent-objects-api[Dependent objects API] +** link:{{navprefix}}/search-data-api[Search data API] +** link:{{navprefix}}/liveboard-data-api[Liveboard data API] +** link:{{navprefix}}/liveboard-export-api[Liveboard export API] +** link:{{navprefix}}/security-api[Security API] +** link:{{navprefix}}/logs-api[Audit logs API] +** link:{{navprefix}}/materialization-api[Materialization API] +** link:{{navprefix}}/database-api[Database API] +** link:{{navprefix}}/rest-v1-changelog[REST API v1 changelog] +** link:{{navprefix}}/v1v2-comparison[REST v1 and v2.0 comparison] + + +//** link:{{navprefix}}/graphql-guide[GraphQL API ^Beta^] + + + + + + diff --git a/modules/ROOT/pages/common/nav-spottercode.adoc b/modules/ROOT/pages/common/nav-spottercode.adoc new file mode 100644 index 000000000..b60c85c31 --- /dev/null +++ b/modules/ROOT/pages/common/nav-spottercode.adoc @@ -0,0 +1,12 @@ + +:page-pageid: nav-spottercode +:page-description: SpotterCode navigation + +[navSection] + +[.sidebar-title] +SpotterCode agent + +* link:{{navprefix}}/SpotterCode[SpotterCode for IDEs] +* link:{{navprefix}}/integrate-SpotterCode[Integrating SpotterCode] +* link:{{navprefix}}/spottercode-prompting-guide[SpotterCode prompting guide] diff --git a/modules/ROOT/pages/common/nav-tutorials.adoc b/modules/ROOT/pages/common/nav-tutorials.adoc new file mode 100644 index 000000000..b7933f53d --- /dev/null +++ b/modules/ROOT/pages/common/nav-tutorials.adoc @@ -0,0 +1,29 @@ + +:page-pageid: nav-tutorials +:page-description: Tutorials navigation + +[navSection] + +* link:{{navprefix}}/tutorials/tutorials-overview[Tutorials] +** link:{{navprefix}}/tutorials/tse-fundamentals/intro[Embedding Fundamentals] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-01[01 - Overview] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-02[02 - Set up for course] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-03[03 - Security setup] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-04[04 - Start coding] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-05[05 - Embed Search] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-06[06 - Embed Natural Language Search] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-07[07 - Embed Liveboard] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-08[08 - Embed Visualization] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-09[09 - Embed full application] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-10[10 - Style embedded app] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-11[11 - Course summary] +** link:{{navprefix}}/tutorials/style-customization/tutorial[Style customization] +** link:{{navprefix}}/tutorials/react-components/intro[React components] +*** link:{{navprefix}}/tutorials/react-components/lesson-01[01 - Initialize Visual Embed SDK] +*** link:{{navprefix}}/tutorials/react-components/lesson-02[02 - ThoughtSpot component pages] +*** link:{{navprefix}}/tutorials/react-components/lesson-03[03 - Menus and navigation elements] +*** link:{{navprefix}}/tutorials/react-components/lesson-04[04 - Event handling] + +*** link:{{navprefix}}/tutorials/rest-api/lesson-04[04 - Event handling] +** Spotter +*** link:{{navprefix}}/tutorials/spotter/integrate-into-chatbot[Integrate Spotter into your Chatbot] diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index 0a8fbeb9d..a3af2a9a6 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -4,254 +4,97 @@ [navSection] -* link:{{navprefix}}/ask-docs[AskDocs ^Beta^] +[.sidebar-title] +Release notes and changelogs -* link:{{navprefix}}/whats-new[What's New] -** link:{{navprefix}}/whats-new[New features] -*** link:{{navprefix}}/fixed-issues[Fixed issues] -*** link:{{navprefix}}/known-issues[Known Issues] +* link:{{navprefix}}/whats-new[What's new] +* Changelog +** 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}}/deprecated-features[Deprecation announcements] +[.sidebar-title] +Live Playgrounds -** link:{{navprefix}}/embed-sdk-changelog[SDK and API changelog] -*** link:{{navprefix}}/embed-sdk-changelog[Visual Embed changelog] -*** link:{{navprefix}}/mobile-sdk-changelog[Mobile Embed SDK changelog] -*** link:{{navprefix}}/rest-v2-changelog[REST API v2 changelog] -*** link:{{navprefix}}/rest-v1-changelog[REST API v1 changelog] -** link:{{navprefix}}/deprecated-features[Deprecation announcements] +* +++Visual Embed Playground+++ +** link:{{navprefix}}/dev-playground[How to use] -* Live Playgrounds -** +++Visual Embed Playground+++ -** link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fgetting-started%2Fintroduction[REST API v2 Playground] -** link:{{navprefix}}/graphql-play-ground[GraphQL Playground] -** +++REST API v1 Playground+++ -** link:{{navprefix}}/theme-builder[Theme Builder] -** link:{{navprefix}}/spotdev-portal[How to use] -*** link:{{navprefix}}/dev-playground[Visual Embed Playground] -*** link:{{navprefix}}/graphql-playground[GraphQL Playground] -*** link:{{navprefix}}/rest-playground[REST API Playground] +* link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fgetting-started%2Fintroduction[REST API v2 Playground] +** link:{{navprefix}}/rest-playground[How to use] +//** link:{{navprefix}}/graphql-play-ground[GraphQL Playground] +//** +++REST API v1 Playground+++ +* link:{{navprefix}}/theme-builder[Theme Builder] +** link:{{navprefix}}/theme-builder-doc[How to use] -* link:{{navprefix}}/tutorials/tutorials-overview[Tutorials] -** link:{{navprefix}}/tutorials/tse-fundamentals/intro[Embedding Fundamentals] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-01[01 - Overview] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-02[02 - Set up for course] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-03[03 - Security setup] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-04[04 - Start coding] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-05[05 - Embed Search] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-06[06 - Embed Natural Language Search] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-07[07 - Embed Liveboard] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-08[08 - Embed Visualization] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-09[09 - Embed full application] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-10[10 - Style embedded app] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-11[11 - Course summary] -** link:{{navprefix}}/tutorials/style-customization/tutorial[Style customization] -** link:{{navprefix}}/tutorials/react-components/intro[React components] -*** link:{{navprefix}}/tutorials/react-components/lesson-01[01 - Initialize Visual Embed SDK] -*** link:{{navprefix}}/tutorials/react-components/lesson-02[02 - ThoughtSpot component pages] -*** link:{{navprefix}}/tutorials/react-components/lesson-03[03 - Menus and navigation elements] -*** link:{{navprefix}}/tutorials/react-components/lesson-04[04 - Event handling] -** link:{{navprefix}}/tutorials/rest-api/intro[REST API] -*** link:{{navprefix}}/tutorials/rest-api/lesson-01[01 - REST API overview] -*** link:{{navprefix}}/tutorials/rest-api/lesson-02[02 - Simple Python implementation] -*** link:{{navprefix}}/tutorials/rest-api/lesson-03[03 - Complex REST API workflows] -*** link:{{navprefix}}/tutorials/rest-api/lesson-04[04 - Event handling] -** Spotter -*** link:{{navprefix}}/tutorials/spotter/integrate-into-chatbot[Integrate Spotter into your Chatbot] -* link:{{navprefix}}/getting-started[Embed ThoughtSpot] -** link:{{navprefix}}/getting-started[Quickstart Guide] -** link:{{navprefix}}/tsembed[Embed ThoughtSpot in Web app] -*** Embed analytics -**** link:{{navprefix}}/embed-liveboard[Embed a Liveboard] -**** link:{{navprefix}}/embed-a-viz[Embed a visualization] -*** link:{{navprefix}}/embed-ai-search-analytics[Embed AI Search and Analytics] -**** link:{{navprefix}}/embed-spotter[Embed Spotter experience] -**** link:{{navprefix}}/embed-spotter-agent[Embed Spotter Agent] -*** link:{{navprefix}}/full-embed[Embed full application] -**** link:{{navprefix}}/full-app-customize[Customize your embed] -**** link:{{navprefix}}/customize-nav-controls[Customize navigation panels] -**** link:{{navprefix}}/set-default-page[Customize default page and navigation path] -**** link:{{navprefix}}/customize-homepage-experience[Customize home page experience] - -*** Embed token-based Search -**** link:{{navprefix}}/search-embed[Embed Search] -**** link:{{navprefix}}/embed-searchbar[Embed search bar] -*** link:{{navprefix}}/react-app-embed[Embed with React components] -** link:{{navprefix}}/mobile-embed[Embed ThoughtSpot in a mobile app] -*** link:{{navprefix}}/embed-ts-mobile-react-native[React Native SDK] -*** link:{{navprefix}}/embed-ts-flutter[Flutter embed SDK] -*** link:{{navprefix}}/embed-ts-swift[Swift Embed SDK] -*** link:{{navprefix}}/embed-ts-android[Android Embed SDK] - -** Customize and integrate -*** link:{{navprefix}}/style-customization[Customize UI layout and styles] -**** link:{{navprefix}}/customize-style[Customize basic styles] -**** link:{{navprefix}}/custom-css[CSS customization framework] -***** link:{{navprefix}}/css-variables-reference[CSS variables reference] -***** link:{{navprefix}}/customize-icons[Customize icons] -***** link:{{navprefix}}/customize-text[Customize text strings] -***** link:{{navprefix}}/theme-builder-doc[Theme builder] - -*** link:{{navprefix}}/filters-overview[Filters overview] -**** link:{{navprefix}}/runtime-overrides[Runtime overrides] -**** link:{{navprefix}}/runtime-filters[Runtime filters] -**** link:{{navprefix}}/runtime-params[Runtime Parameters] - -*** link:{{navprefix}}/action-config[Customize menus] -**** link:{{navprefix}}/actions[Action IDs in the SDK] -*** link:{{navprefix}}/events-app-integration[Events and app interactions] -**** link:{{navprefix}}/embed-events[Using embed events] -**** link:{{navprefix}}/host-events[Using host events] -**** link:{{navprefix}}/context-aware-event-routing[Context-based execution of host events] -**** link:{{navprefix}}/hostEventsV2-migration[Migrating from Host Event v1 to Host Events v2 framework] -**** link:{{navprefix}}/api-search-intercept[API intercept and data fetch requests] -*** link:{{navprefix}}/custom-action-intro[Custom actions] -**** link:{{navprefix}}/customize-actions[Custom actions through the UI] -***** link:{{navprefix}}/custom-action-url[URL actions] -***** link:{{navprefix}}/custom-action-callback[Callback actions] -***** link:{{navprefix}}/edit-custom-action[Set the position of a custom action] -***** link:{{navprefix}}/add-action-viz[Add a local action to a visualization] -***** link:{{navprefix}}/add-action-worksheet[Add a local action to a model] -**** link:{{navprefix}}/code-based-custom-action[Code based custom actions] -**** link:{{navprefix}}/custom-action-payload[Callback response payload] -*** link:{{navprefix}}/customize-links[Customize links] -*** link:{{navprefix}}/set-locale[Customize locale] -*** link:{{navprefix}}/custom-domain-config[Custom domain configuration] -*** link:{{navprefix}}/customize-emails[Customize onboarding settings] -*** link:{{navprefix}}/customize-email-apis[Customize email template] -*** link:{{navprefix}}/in-app-navigation[Create dynamic menus and navigation] -** link:{{navprefix}}/security-settings[Security settings] -** link:{{navprefix}}/embed-auth[Authentication] -*** link:{{navprefix}}/trusted-auth[Trusted authentication] -**** link:{{navprefix}}/trusted-auth-secret-key[Secret key management] -**** link:{{navprefix}}/trusted-auth-sdk[Front-end trusted authentication integration] -**** link:{{navprefix}}/trusted-auth-token-request-service[Token request service] -**** link:{{navprefix}}/trusted-auth-troubleshoot[Troubleshoot trusted authentication] -*** link:{{navprefix}}/saml-sso[SAML SSO authentication] -*** link:{{navprefix}}/oidc-auth[OpenID Connect authentication] -*** link:{{navprefix}}/just-in-time-provisioning[Just-in-time provisioning] -** link:{{navprefix}}/embed-object-access[Authorization] -*** link:{{navprefix}}/access-control-sharing[Access control and sharing] -*** link:{{navprefix}}/privileges-and-roles[Privileges and Roles] -*** link:{{navprefix}}/data-security[Data security] -**** link:{{navprefix}}/rls-rules[RLS Rules] -**** link:{{navprefix}}/abac-via-rls-variables[ABAC via RLS with variables] -**** link:{{navprefix}}/jwt-abac-migration-guide[ABAC JWT migration guide] -***** link:{{navprefix}}/jwt-filter-parameters-rules-migration-guide[JWT ABAC with filter rules -> ABAC via RLS] -***** link:{{navprefix}}/jwt-abac-beta-migration-guide[JWT ABAC beta implementation -> ABAC via RLS] -**** link:{{navprefix}}/abac-user-parameters[ABAC via JWT with filter rules and parameters] -*** link:{{navprefix}}/selective-user-access[User access] -** link:{{navprefix}}/best-practices[Performance optimization] -*** link:{{navprefix}}/best-practices[Best practices] -*** link:{{navprefix}}/prerender[Prerender components] -*** link:{{navprefix}}/lazy-load-fullHeight[Full height and lazy loading options] -*** link:{{navprefix}}/prefetch[Prefetch static resources] -** link:{{navprefix}}/VisualEmbedSdk[Visual Embed SDK Reference] -include::generated/typedoc/CustomSideNav.adoc[] -*** Custom styles -**** [.typedoc-Interface]#link:{{navprefix}}/Interface_CustomStyles[CustomStyles]# -**** [.typedoc-Interface]#link:{{navprefix}}/Interface_CustomisationsInterface[CustomisationsInterface]# -**** [.typedoc-Interface]#link:{{navprefix}}/Interface_customCssInterface[customCssInterface]# -**** [.typedoc-Interface]#link:{{navprefix}}/Interface_CustomCssVariables[customCssVariables]# -*** Runtime filters -**** [.typedoc-Interface]#link:{{navprefix}}/Interface_RuntimeFilter[RuntimeFilter]# -**** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_RuntimeFilterOp[RuntimeFilterOp]# -*** Others -**** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_Action[Action]# -**** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_ContextMenuTriggerOptions[ContextMenuTriggerOptions]# -**** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_DataSourceVisualMode[DataSourceVisualMode]# -**** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_Page[Page]# -**** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_PrefetchFeatures[PrefetchFeatures]# -**** [.typedoc-Function]#link:{{navprefix}}/Function_executeTML[executeTML]# -**** [.typedoc-Function]#link:{{navprefix}}/Function_exportTML[exportTML]# - -** Other embedding methods -*** link:{{navprefix}}/embed-without-sdk[Embed without SDK] -*** link:{{navprefix}}/custom-viz-rest-api[Create a custom visualization] -** link:{{navprefix}}/troubleshoot-errors[Troubleshoot errors] - -* link:{{navprefix}}/rest-apis[REST API] -** link:{{navprefix}}/rest-apis[Overview] -** link:{{navprefix}}/api-user-management[Users and group privileges] -** link:{{navprefix}}/rbac[Role-based access control] -** link:{{navprefix}}/spotter-api[Spotter APIs] -*** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] -*** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] -*** link:{{navprefix}}/spotter-coaching-apis[Spotter coaching APIs ^BETA^] +//*** link:{{navprefix}}/graphql-playground[GraphQL Playground] -** link:{{navprefix}}/audit-logs[Audit logs] -** link:{{navprefix}}/tml[TML] -** link:{{navprefix}}/collections[Collections] -** link:{{navprefix}}/connections[Connections] -*** link:{{navprefix}}/connection-config[Connection configuration] -** link:{{navprefix}}/rest-apiv2-getstarted[REST API v2.0] -*** link:{{navprefix}}/rest-apiv2-getstarted[Get started] -*** link:{{navprefix}}/api-authv2[REST API v2.0 authentication] -*** link:{{navprefix}}/rest-apiv2-js[REST API v2.0 in JavaScript] -*** link:{{navprefix}}/rest-apiv2-search[REST API v2.0 Search endpoints] -**** link:{{navprefix}}/rest-apiv2-users-search[Search users] -**** link:{{navprefix}}/rest-apiv2-groups-search[Search groups] -**** link:{{navprefix}}/rest-apiv2-metadata-search[Search metadata] -*** link:{{navprefix}}/fetch-data-and-report-apis[Data and Report APIs] -*** link:{{navprefix}}/rest-api-sdk[REST API v2.0 SDKs] -**** link:{{navprefix}}/rest-api-sdk-typescript[TypeScript SDK] -**** link:{{navprefix}}/rest-api-sdk-java[Java SDK] -** link:{{navprefix}}/rest-apiv2-reference[REST API v2.0 Reference] -** link:{{navprefix}}/rest-api-getstarted[REST API v1] -*** link:{{navprefix}}/rest-api-getstarted[Get started] -*** link:{{navprefix}}/api-auth-session[REST API v1 authentication] -*** link:{{navprefix}}/catalog-and-audit[Catalog and audit content] -*** link:{{navprefix}}/rest-api-pagination[Paginate API response] -** link:{{navprefix}}/rest-api-reference[REST API v1 Reference] -*** link:{{navprefix}}/orgs-api[Orgs API] -*** link:{{navprefix}}/user-api[User API] -*** link:{{navprefix}}/group-api[Group API] -*** link:{{navprefix}}/role-api[Role API] -*** link:{{navprefix}}/session-api[Session API] -*** link:{{navprefix}}/connections-api[Data connection API] -*** link:{{navprefix}}/metadata-api[Metadata API] -*** link:{{navprefix}}/admin-api[Admin API] -*** link:{{navprefix}}/tml-api[TML API] -*** link:{{navprefix}}/dependent-objects-api[Dependent objects API] -*** link:{{navprefix}}/search-data-api[Search data API] -*** link:{{navprefix}}/liveboard-data-api[Liveboard data API] -*** link:{{navprefix}}/liveboard-export-api[Liveboard export API] -*** link:{{navprefix}}/security-api[Security API] -*** link:{{navprefix}}/logs-api[Audit logs API] -*** link:{{navprefix}}/materialization-api[Materialization API] -*** link:{{navprefix}}/database-api[Database API] -** link:{{navprefix}}/runtime-sort[Runtime sorting] -** link:{{navprefix}}/v1v2-comparison[REST v1 and v2.0 comparison] -** link:{{navprefix}}/graphql-guide[GraphQL API ^Beta^] -** link:{{navprefix}}/webhooks[Webhooks] -*** link:{{navprefix}}/webhooks-comm-channel[Configure and monitor webhook communication channels] -*** link:{{navprefix}}/webhooks-s3-integration[Deliver Liveboard reports to AWS S3 Storage] -*** link:{{navprefix}}/webhooks-lb-schedule[Deliver Liveboard reports to external application] -*** link:{{navprefix}}/webhooks-lb-payload[Webhook response payload] -*** link:{{navprefix}}/webhooks-kpi[Webhook for KPI alerts] +[.sidebar-title] +Get started -* MCP Servers and Tools -** link:{{navprefix}}/SpotterCode[SpotterCode for IDEs] -*** link:{{navprefix}}/integrate-SpotterCode[Integrating SpotterCode] -*** link:{{navprefix}}/spottercode-prompting-guide[SpotterCode prompting guide] -** link:{{navprefix}}/ai-analytics-integration[ThoughtSpot AI analytics integration] -*** link:{{navprefix}}/mcp-integration[ThoughtSpot MCP server] -*** link:{{navprefix}}/connect-mcp-server-to-clients[Connecting MCP Server to MCP clients] -*** link:{{navprefix}}/custom-chatbot-integration-mcp[Integrating MCP Server in a custom application or chatbot] +* link:{{navprefix}}/getting-started[Embed ThoughtSpot] +* link:{{navprefix}}/SpotterCode[SpotterCode for IDEs] +* link:{{navprefix}}/rest-apis[REST APIs] +* link:{{navprefix}}/ai-analytics-integration[AI analytics integration] +* link:{{navprefix}}/mcp-integration[MCP Server integration] +//** link:{{navprefix}}/tutorials/tutorials-overview[Tutorials] +* link:{{navprefix}}/VisualEmbedSdk[SDK and API reference] +** link:{{navprefix}}/VisualEmbedSdk[Visual Embed SDK] +** link:{{navprefix}}/rest-apiv2-reference[REST API] +** link:{{navprefix}}/mcp-tool-reference[MCP tools] + + +[.sidebar-title] +Build and deploy + +* link:{{navprefix}}/development-and-deployment[Development and deployment] +** link:{{navprefix}}/thoughtspot-objects[ThoughtSpot objects] +** 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}}/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] + +[.sidebar-title] +Multi-tenancy + +* link:{{navprefix}}/multi-tenancy[Overview] +* link:{{navprefix}}/orgs[Multi-tenancy with Orgs] +** link:{{navprefix}}/orgs-api-op[Org administration] +** 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}}/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[Custom variables] -*** link:{{navprefix}}/parameterize-metadata[Parameterize metadata] -*** link:{{navprefix}}/git-integration[Deploy with Git] -**** link:{{navprefix}}/git-configuration[Configure Git integration] -**** link:{{navprefix}}/git-api[Version Control REST APIs] -**** link:{{navprefix}}/guid-mapping[GUID mapping] +*** link:{{navprefix}}/variables[Variables] +*** link:{{navprefix}}/parameterze-metdata[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] @@ -265,20 +108,17 @@ include::generated/typedoc/CustomSideNav.adoc[] ** link:{{navprefix}}/pendo-integration[Pendo integration with embed] ** link:{{navprefix}}/sf-integration[Integration with Salesforce] ** link:{{navprefix}}/vercel-integration[Vercel integration] -* Additional references -** link:{{navprefix}}/embed-ts[About ThoughtSpot embedding] -** link:{{navprefix}}/get-started-tse[Embed licenses] -** link:{{navprefix}}/license-feature-matrix[Feature matrix] -** link:{{navprefix}}/faqs[FAQs] -** link:{{navprefix}}/code-samples[Code samples] -** link:https://codesandbox.io/s/big-tse-react-demo-i4g9xi[React CodeSandbox, window=_blank] -** link:https://codesandbox.io/s/graphqlcookieembed-wf4fk9?file=/src/App.js:418-426[GraphQL CodeSandbox, window=_blank] -* Resources -** link:https://developers.thoughtspot.com[ThoughtSpot Developers, window=_blank] -** link:https://community.thoughtspot.com/customers/s/[Community, window=_blank] -** link:https://developers.thoughtspot.com/guides[Tutorials, window=_blank] -** link:https://developers.thoughtspot.com/codespot[CodeSpot, window=_blank] -** link:https://training.thoughtspot.com/page/developer[Training resources, window=_blank] -** link:https://docs.thoughtspot.com[Product Documentation, window=_blank] +[.sidebar-title] +Additional resources + +* link:{{navprefix}}/faqs[FAQs] +* link:https://codesandbox.io/s/big-tse-react-demo-i4g9xi[React CodeSandbox, window=_blank] +//** link:https://codesandbox.io/s/graphqlcookieembed-wf4fk9?file=/src/App.js:418-426[GraphQL CodeSandbox, window=_blank] + +* link:https://community.thoughtspot.com/customers/s/[Community, window=_blank] +* link:https://training.thoughtspot.com/page/developer[Training resources, window=_blank] +* link:https://docs.thoughtspot.com[Product Documentation, window=_blank] +* link:https://developers.thoughtspot.com[ThoughtSpot Developers, window=_blank] +* Deprecated feature docs ** link:{{navprefix}}/abac-user-parameters-beta[ABAC via tokens (pre-10.4.0.cl) (Deprecated)] diff --git a/modules/ROOT/pages/deploy-with-tml-apis.adoc b/modules/ROOT/pages/deploy-with-tml-apis.adoc index 14b0abb3a..e09eaf7d8 100644 --- a/modules/ROOT/pages/deploy-with-tml-apis.adoc +++ b/modules/ROOT/pages/deploy-with-tml-apis.adoc @@ -8,156 +8,258 @@ When deploying embedded analytics, each organization will have defined practices for development, testing, and deployment of content to ThoughtSpot. ThoughtSpot instances act as a constantly running service, so deployment only involves publishing *ThoughtSpot content*, in the form of link:https://docs.thoughtspot.com/cloud/latest/tml[ThoughtSpot Modeling Language (TML), window=_blank] files to a given ThoughtSpot instance. -ThoughtSpot has xref:version_control.adoc[Git integration] designed to automate most of the steps involved in the following process. Please see if the xref:version_control.adoc[Git integration capabilities] will work for your needs before building a process with the TML APIs directly. +The most typical pattern with ThoughtSpot involves a dev Org where content is modified by the team and then those objects are marked to form a "release" package, which then have their TML exported into a "release" branch in Git: -NOTE: Any example workflow you see within this document has been implemented and tested within the libraries available in the xref:development-and-deployment.adoc#relatedResources[Additional Resources]. We recommend that you start with these libraries and tools. +image::./images/multi_tenant_deployment.png[Multi-tenant Database Deployment SDLC Pattern] + +The TML files in the "release" branch are then moved into other "deployment branches" via pull/merge request. + +Other ThoughtSpot Orgs are "deployed to" by importing TML from their designated "deployment branch". + +The formalized release process is separate from xref:development-and-deployment.adoc#_version_control[version control], which is concerned with capturing all changes of all content in a given Org. == Overview The three steps to building an SDLC process with ThoughtSpot are: - . *xref:linkExportSource[Export source]*: Downloading ThoughtSpot objects as TML files into a source control system (for example, Git) - . *xref:linkBuildRelease[Build release]*: Altering copies of the TML files for the next stage / environment + . *xref:linkBuildRelease[Identify objects for release]*: Determine which objects in "dev Org" should become part of the "release" package + . *xref:linkExportSource[Export release TML into Git]*: Downloading ThoughtSpot objects as TML files into a source control system (for example, Git) . *xref:linkImportRelease[Import release]*: Importing the TML files into the new environment -Every object on a ThoughtSpot instance has a *GUID* as a unique reference. +== Pre-requisites +For TML files to be portable between any Org on any instance, the objects must have *obj_ids* and all Table and Connection objects must have been xref:metadata-parameterization.adoc[parameterized] with the appropriate xref:variables.adoc[variables] where necessary. -The *most essential* aspect of steps 2 and 3 is recording any newly created object GUIDs from the destination environment into a *xref:guidMapping[mapping file]* along with the GUID of the source object. +Once these pre-requisites are complete, your TML will be ready for TML Import across Orgs or publishing: -When publishing to a new environment on the same ThoughtSpot instance, you *must* swap out the GUIDs from the source environment with those of the equivalent objects in the destination environment within the TML files, so that only destination environment content is referenced. +[,YAML] +---- +obj_id: My_Connection__DATA_CHALLENGE__SALES +table: + name: SALES + db: ${dc_db} + schema: ${dc_schema} + db_table: SALES + connection: + name: My Connection + obj_id: My_Connection +---- -== Deployment scenarios +=== Parameterization with variables +In a single-tenanted database pattern, customer data is split into many separate logical databases or schemas, typically with identical table structures. -* xref:#_instance_to_instance_deployment[Instance-to-instance deployment] -* xref:#_multiple_environments_on_the_same_instance[Multiple environments on the same instance] +Queries for each customer can be identical by *xref:metadata-parameterization.adoc[parameterizing]* the attributes that vary. ThoughtSpot provides xref:variables.adoc[variables] that can be referenced in TML for this purpose. -=== Instance-to-instance deployment -The simplest deployment scenario is moving content from one ThoughtSpot instance to another separate instance. +Details about the fully-qualified table name are stored in each Table object in ThoughtSpot, rather than in the Connection object. The following can be parameterized in a Table TML file: -The TML Import process will use the `guid:` property of the imported TML files as the GUID for the new objects on the destination instance on all instances later than 9.0.0, which includes all ThoughtSpot Cloud deployments. +* database +* schema +* db_table_name -This means that a mapping file or swapping in and out GUIDs is not required. Make sure that all Connections have the same unique names on both instances and TML files should import without any modifications. +Properties of a Connection can also be parameterized. -If your instance is running a ThoughtSpot release version lower than 9.0.0.cl, refer to the xref:development-and-deployment.adoc#_notes_for_older_releases[Notes for older releases]. +Parameterization works with both TML import and xref:publishing-overview.adoc[publishing]. -=== Multiple environments on the same instance +=== obj_id +Before implementing any deployment process, you should ensure that `obj_id` is enabled on your ThoughtSpot instance. -Many ThoughtSpot customers have multiple "environments" on the same instance, either using xref:orgs.adoc[Orgs] or well-defined xref:multi-tenancy-best-practices.adoc[Access Control]. +[NOTE] +==== +Objects are only assigned automatic `obj_id` after the first change to the object once `obj_id` is enabled on an instance. +==== -In this scenario, you must track the equivalent GUIDS between source and destination environments, and swap them out within the TML files for your deployment process to work correctly. +`obj_id` for an object is available in the response from `/metadata/search` REST API as `metadata_obj_id` property: -The workflow for a very simple "dev" to "prod" flow on the same environment shown here, is the same pattern for any source-to-destination environment flow: +[,json] +---- +{ + "metadata_id":"c1e4043a-4524-4fcb-a20f-9e7aff4dc972", + "metadata_name":"Retail Sales RAD - KPIs", + "metadata_type":"LIVEBOARD", + "metadata_obj_id":"RetailSalesRAD-KPIs-c1e4043a" +} +---- +The format of `obj_id` above, with the `-{startOfGUID}` portion at the end, indicates it was an auto-generated obj_id. If the property value was `null`, then it is an object that has not been updated since the feature was enabled. -image::./images/development-deployment-process.png[Development and deployment workflow] +The `metadata/update-obj-id` REST API endpoint can change an object's `obj_id` property based on either the `metadata_id` (GUID) or the current `metadata_obj_id`: -[#guidMapping] -== GUID mapping file -As noted above, keeping a *mapping file* of GUIDs of source objects and their descendant objects in the destination environment is essential. The exact structure of the file will depend on the complexity of your deployment needs. +[,json] +---- +{ + "metadata": [ + { + "metadata_identifier": "c1e4043a-4524-4fcb-a20f-9e7aff4dc972", + "new_obj_id": "RetailSalesRAD-KPIs" + + } + ] +} +---- -The simplest pattern is to assume that releases are built exclusively from the "dev" environment, regardless of the destination environment. This pattern can be represented in the simple JSON structure: +or -[source,json] +[,json] ---- { - "test": { - "${type}: ${content}