synapse-react-client 4.0.11 → 4.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SWC.index.d.ts +1 -1
- package/dist/SWC.index.js +1 -1
- package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.d.ts +44 -0
- package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.d.ts.map +1 -0
- package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.js +46 -0
- package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.js.map +1 -0
- package/dist/components/DownloadCart/DownloadCartPage.d.ts.map +1 -1
- package/dist/components/DownloadCart/DownloadCartPage.js +183 -185
- package/dist/components/DownloadCart/DownloadCartPage.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
- package/dist/components/DraggableDialog/DraggableDialog.js +21 -21
- package/dist/components/DraggableDialog/DraggableDialog.js.map +1 -1
- package/dist/components/EntityAclEditor/EntityAclEditor.js +8 -8
- package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
- package/dist/components/EntityAclEditor/InheritanceMessage.d.ts.map +1 -1
- package/dist/components/EntityAclEditor/InheritanceMessage.js +1 -2
- package/dist/components/EntityAclEditor/InheritanceMessage.js.map +1 -1
- package/dist/components/FullTextSearch/FullTextSearch.d.ts.map +1 -1
- package/dist/components/FullTextSearch/FullTextSearch.js +86 -47
- package/dist/components/FullTextSearch/FullTextSearch.js.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js +157 -157
- package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
- package/dist/components/HeaderCard.d.ts.map +1 -1
- package/dist/components/HeaderCard.js +131 -130
- package/dist/components/HeaderCard.js.map +1 -1
- package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.d.ts +4 -1
- package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.d.ts.map +1 -1
- package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.js +3 -2
- package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.js.map +1 -1
- package/dist/components/QueryContext/QueryContext.d.ts +6 -0
- package/dist/components/QueryContext/QueryContext.d.ts.map +1 -1
- package/dist/components/QueryContext/QueryContext.js.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +12 -11
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +5 -0
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +32 -29
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/UseRowSet.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/UseRowSet.js +4 -1
- package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +59 -0
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -0
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +174 -0
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -0
- package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts +40 -0
- package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts.map +1 -0
- package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js +100 -0
- package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js.map +1 -0
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +56 -0
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -0
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +73 -0
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -0
- package/dist/components/ShareThisPage/ShareThisPage.js +1 -1
- package/dist/components/ShareThisPage/ShareThisPage.js.map +1 -1
- package/dist/components/SynapseChat/GridAgentChat.d.ts.map +1 -1
- package/dist/components/SynapseChat/GridAgentChat.js +20 -14
- package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChat.d.ts +3 -1
- package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
- package/dist/components/SynapseChat/SynapseChat.js +51 -36
- package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
- package/dist/components/SynapseHomepageV2/HotdropsAndNews.css +1 -1
- package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.js +8 -7
- package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.js.map +1 -1
- package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.scss +16 -0
- package/dist/components/SynapseHomepageV2/WordPressNews.d.ts +3 -1
- package/dist/components/SynapseHomepageV2/WordPressNews.d.ts.map +1 -1
- package/dist/components/SynapseHomepageV2/WordPressNews.js +9 -8
- package/dist/components/SynapseHomepageV2/WordPressNews.js.map +1 -1
- package/dist/components/SynapseHomepageV2/WordPressNewsItem.d.ts +2 -1
- package/dist/components/SynapseHomepageV2/WordPressNewsItem.d.ts.map +1 -1
- package/dist/components/SynapseHomepageV2/WordPressNewsItem.js +2 -2
- package/dist/components/SynapseHomepageV2/WordPressNewsItem.js.map +1 -1
- package/dist/components/SynapseTable/SearchV2.d.ts +7 -0
- package/dist/components/SynapseTable/SearchV2.d.ts.map +1 -1
- package/dist/components/SynapseTable/SearchV2.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableRenderers.d.ts.map +1 -1
- package/dist/components/SynapseTable/SynapseTableRenderers.js +1 -1
- package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
- package/dist/components/SynapseTable/usePrefetchTableData.d.ts.map +1 -1
- package/dist/components/SynapseTable/usePrefetchTableData.js +6 -5
- package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
- package/dist/components/ToastMessage/ToastMessage.d.ts +1 -1
- package/dist/components/ToastMessage/ToastMessage.d.ts.map +1 -1
- package/dist/components/ToastMessage/ToastMessage.js +2 -2
- package/dist/components/ToastMessage/ToastMessage.js.map +1 -1
- package/dist/components/error/ErrorPage.d.ts +0 -4
- package/dist/components/error/ErrorPage.d.ts.map +1 -1
- package/dist/components/error/ErrorPage.js +25 -30
- package/dist/components/error/ErrorPage.js.map +1 -1
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +41 -39
- package/dist/components/widgets/query-filter/FacetFilterControls.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterControls.js +2 -2
- package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
- package/dist/index.js +52 -50
- package/dist/index.js.map +1 -1
- package/dist/mocks/entity/index.d.ts.map +1 -1
- package/dist/mocks/entity/index.js +18 -16
- package/dist/mocks/entity/index.js.map +1 -1
- package/dist/mocks/mockSearchQueryData.d.ts +14 -0
- package/dist/mocks/mockSearchQueryData.d.ts.map +1 -0
- package/dist/mocks/mockSearchQueryData.js +564 -0
- package/dist/mocks/mockSearchQueryData.js.map +1 -0
- package/dist/mocks/msw/handlers/searchQueryHandlers.d.ts +22 -0
- package/dist/mocks/msw/handlers/searchQueryHandlers.d.ts.map +1 -0
- package/dist/mocks/msw/handlers/searchQueryHandlers.js +63 -0
- package/dist/mocks/msw/handlers/searchQueryHandlers.js.map +1 -0
- package/dist/mocks/msw/handlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers.js +9 -7
- package/dist/mocks/msw/handlers.js.map +1 -1
- package/dist/style/components/_cards.scss +15 -0
- package/dist/style/main.css +1 -1
- package/dist/synapse-client/SynapseClient.d.ts +7 -1
- package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
- package/dist/synapse-client/SynapseClient.js +422 -417
- package/dist/synapse-client/SynapseClient.js.map +1 -1
- package/dist/synapse-client/index.js +3 -3
- package/dist/synapse-queries/KeyFactory.d.ts +2 -0
- package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
- package/dist/synapse-queries/KeyFactory.js +3 -0
- package/dist/synapse-queries/KeyFactory.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/APIConstants.d.ts +2 -0
- package/dist/utils/APIConstants.d.ts.map +1 -1
- package/dist/utils/APIConstants.js +2 -2
- package/dist/utils/APIConstants.js.map +1 -1
- package/dist/utils/functions/calculateFriendlyFileSize.d.ts.map +1 -1
- package/dist/utils/functions/calculateFriendlyFileSize.js +3 -3
- package/dist/utils/functions/calculateFriendlyFileSize.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { parseEntityIdFromSqlStatement as e } from "../../utils/functions/SqlFunctions.js";
|
|
2
|
+
import { useSynapseContext as t } from "../../utils/context/SynapseContext.js";
|
|
3
|
+
import { SessionInitializedGuard as n } from "../../utils/AppUtils/session/SessionInitializedGuard.js";
|
|
4
|
+
import r from "../../synapse-queries/entity/useEntityBundle.js";
|
|
5
|
+
import { useGetEntity as i } from "../../synapse-queries/entity/useEntity.js";
|
|
6
|
+
import { hasResettableFilters as a } from "../../utils/functions/queryUtils.js";
|
|
7
|
+
import "../../synapse-queries/index.js";
|
|
8
|
+
import { QueryContextProvider as o, useQueryContext as s } from "../QueryContext/QueryContext.js";
|
|
9
|
+
import { goToPage as c } from "../../utils/hooks/useImmutableTableQuery/TableQueryReducerActions.js";
|
|
10
|
+
import l from "../../utils/hooks/useImmutableTableQuery/useImmutableTableQuery.js";
|
|
11
|
+
import u from "../QueryWrapper/useHasFacetedSelectColumn.js";
|
|
12
|
+
import { getSearchQueryUseQueryOptions as d, useSearchQueryUseQueryOptions as f } from "./SearchQueryUseQueryOptions.js";
|
|
13
|
+
import { useCallback as p, useEffect as m, useMemo as h } from "react";
|
|
14
|
+
import { cloneDeep as g } from "lodash-es";
|
|
15
|
+
import { jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
16
|
+
import { useQuery as y } from "@tanstack/react-query";
|
|
17
|
+
import { useDeepCompareMemoize as b } from "use-deep-compare-effect";
|
|
18
|
+
import { Provider as x } from "jotai";
|
|
19
|
+
//#region src/components/SearchQueryWrapper/SearchQueryWrapper.tsx
|
|
20
|
+
var S = "search", C = `SELECT * FROM ${S}`;
|
|
21
|
+
function w({ onQueryResultBundleChange: e }) {
|
|
22
|
+
let { queryMetadataQueryOptions: t } = s(), { data: n } = y(t);
|
|
23
|
+
return m(() => {
|
|
24
|
+
n && e(JSON.stringify(n));
|
|
25
|
+
}, [n, e]), null;
|
|
26
|
+
}
|
|
27
|
+
function T(e) {
|
|
28
|
+
return /* @__PURE__ */ _(n, { children: /* @__PURE__ */ _(E, { ...e }) });
|
|
29
|
+
}
|
|
30
|
+
function E(n) {
|
|
31
|
+
let { initQueryRequest: s, onQueryChange: m, onQueryResultBundleChange: y, isInfinite: x = !1, searchIndexId: T, shouldDeepLink: E = !1 } = n, { keyFactory: D, accessToken: O } = t(), { data: k } = i(T, void 0, { throwOnError: !0 }), A = k, j = A?.definingSQL ? e(A.definingSQL) : void 0, { data: M } = r(j, void 0, { includeTableBundle: !0 }, { throwOnError: !0 }), N = M?.tableBundle?.columnModels, { getInitQueryRequest: P, getCurrentQueryRequest: F, setQuery: I, resetQuery: L, removeSelectedFacet: R, removeValueFromSelectedFacet: z, removeQueryFilter: B, removeValueFromQueryFilter: V, nextQueryRequest: H, currentQueryRequest: U, addValueToSelectedFacet: W, setRangeFacetValue: G, resetDebounceTimer: K, currentPage: q, goToPage: J, pageSize: Y, setPageSize: X } = l({
|
|
32
|
+
initQueryRequest: b({
|
|
33
|
+
concreteType: "org.sagebionetworks.repo.model.table.QueryBundleRequest",
|
|
34
|
+
entityId: S,
|
|
35
|
+
partMask: s.partMask ?? 0,
|
|
36
|
+
query: {
|
|
37
|
+
sql: C,
|
|
38
|
+
selectedFacets: s.query?.selectedFacets,
|
|
39
|
+
additionalFilters: s.query?.additionalFilters,
|
|
40
|
+
limit: s.query?.limit,
|
|
41
|
+
offset: s.query?.offset
|
|
42
|
+
}
|
|
43
|
+
}),
|
|
44
|
+
onQueryChange: m,
|
|
45
|
+
shouldDeepLink: E
|
|
46
|
+
}), { rowDataQueryOptions: Z, rowDataInfiniteQueryOptions: Q, queryMetadataQueryOptions: $ } = f(U, T, j);
|
|
47
|
+
return /* @__PURE__ */ v(o, {
|
|
48
|
+
queryContext: b({
|
|
49
|
+
isInfinite: x,
|
|
50
|
+
entityId: void 0,
|
|
51
|
+
versionNumber: void 0,
|
|
52
|
+
nextQueryRequest: H,
|
|
53
|
+
currentQueryRequest: U,
|
|
54
|
+
getCurrentQueryRequest: F,
|
|
55
|
+
getInitQueryRequest: P,
|
|
56
|
+
executeQueryRequest: I,
|
|
57
|
+
hasFacetedSelectColumn: u($),
|
|
58
|
+
hasResettableFilters: h(() => a(F().query, void 0), [F]),
|
|
59
|
+
removeSelectedFacet: R,
|
|
60
|
+
removeValueFromSelectedFacet: z,
|
|
61
|
+
resetQuery: L,
|
|
62
|
+
removeQueryFilter: B,
|
|
63
|
+
removeValueFromQueryFilter: V,
|
|
64
|
+
onViewSharingSettingsClicked: void 0,
|
|
65
|
+
addValueToSelectedFacet: W,
|
|
66
|
+
combineRangeFacetConfig: void 0,
|
|
67
|
+
setRangeFacetValue: G,
|
|
68
|
+
resetDebounceTimer: K,
|
|
69
|
+
rowDataQueryOptions: Z,
|
|
70
|
+
rowDataInfiniteQueryOptions: Q,
|
|
71
|
+
queryMetadataQueryOptions: $,
|
|
72
|
+
currentPage: q,
|
|
73
|
+
goToPage: J,
|
|
74
|
+
pageSize: Y,
|
|
75
|
+
setPageSize: X,
|
|
76
|
+
lockedColumn: void 0,
|
|
77
|
+
fileIdColumnName: void 0,
|
|
78
|
+
fileVersionColumnName: void 0,
|
|
79
|
+
fileNameColumnName: void 0,
|
|
80
|
+
getRowDataQueryOptionsForPage: p((e) => d(c({
|
|
81
|
+
type: "goToPage",
|
|
82
|
+
pageNumber: e
|
|
83
|
+
}, g(F())), D, O, T, N).rowDataQueryOptions, [
|
|
84
|
+
F,
|
|
85
|
+
D,
|
|
86
|
+
O,
|
|
87
|
+
T,
|
|
88
|
+
N
|
|
89
|
+
])
|
|
90
|
+
}),
|
|
91
|
+
children: [y && /* @__PURE__ */ _(w, { onQueryResultBundleChange: y }), n.children]
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
function D(e) {
|
|
95
|
+
return /* @__PURE__ */ _(x, { children: /* @__PURE__ */ _(T, { ...e }) });
|
|
96
|
+
}
|
|
97
|
+
//#endregion
|
|
98
|
+
export { S as SEARCH_QUERY_WRAPPER_SYNTHETIC_ENTITY_ID, C as SEARCH_QUERY_WRAPPER_SYNTHETIC_SQL, D as SearchQueryWrapper };
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=SearchQueryWrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchQueryWrapper.js","names":[],"sources":["../../../src/components/SearchQueryWrapper/SearchQueryWrapper.tsx"],"sourcesContent":["import { hasResettableFilters as hasResettableFiltersUtil } from '@/utils/functions/queryUtils'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions/SqlFunctions'\nimport useImmutableTableQuery from '@/utils/hooks/useImmutableTableQuery/useImmutableTableQuery'\nimport { goToPage as transformQueryToGoToPage } from '@/utils/hooks/useImmutableTableQuery/TableQueryReducerActions'\nimport {\n AsynchronousJobStatus,\n QueryBundleRequest,\n QueryResultBundle,\n} from '@sage-bionetworks/synapse-types'\nimport { Provider } from 'jotai'\nimport { PropsWithChildren, useCallback, useEffect, useMemo } from 'react'\nimport { useDeepCompareMemoize } from 'use-deep-compare-effect'\nimport {\n QueryContextProvider,\n QueryContextType,\n useQueryContext,\n} from '../QueryContext/QueryContext'\nimport {\n getSearchQueryUseQueryOptions,\n useSearchQueryUseQueryOptions,\n} from './SearchQueryUseQueryOptions'\nimport { TableQueryUseQueryOptions } from '../QueryWrapper/TableQueryUseQueryOptions'\nimport useHasFacetedSelectColumn from '../QueryWrapper/useHasFacetedSelectColumn'\nimport { SessionInitializedGuard } from '@/utils/AppUtils/session/SessionInitializedGuard'\nimport { useGetEntity, useGetEntityBundle } from '@/synapse-queries'\nimport type {\n SearchIndexQuery,\n SynapseClientError,\n} from '@sage-bionetworks/synapse-client'\nimport { SearchIndex } from '@sage-bionetworks/synapse-client'\nimport { useQuery, UseQueryOptions } from '@tanstack/react-query'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { cloneDeep } from 'lodash-es'\n\n/**\n * The initQueryRequest used internally within SearchQueryWrapper. It uses a synthetic entity ID\n * and SQL so we can reuse useImmutableTableQuery for facet/pagination state management, even though\n * the actual data is fetched from the SearchQueryServicesApi (not a table entity).\n */\nexport const SEARCH_QUERY_WRAPPER_SYNTHETIC_ENTITY_ID = 'search'\nexport const SEARCH_QUERY_WRAPPER_SYNTHETIC_SQL = `SELECT * FROM ${SEARCH_QUERY_WRAPPER_SYNTHETIC_ENTITY_ID}`\n\nexport type SearchQueryWrapperProps = PropsWithChildren<{\n /**\n * The ID of the SearchIndex entity to query.\n */\n searchIndexId: string\n /**\n * The initial query request. Only `query.selectedFacets`, `query.additionalFilters`,\n * `query.limit`, and `query.offset` are used; the `entityId` and `sql` fields are\n * overridden with synthetic values. The `partMask` controls which parts of the response\n * bundle to request.\n */\n initQueryRequest: {\n concreteType?: QueryBundleRequest['concreteType']\n partMask?: QueryBundleRequest['partMask']\n query?: Partial<QueryBundleRequest['query']>\n }\n /** If onQueryChange is set, the callback will be invoked when the Query changes */\n onQueryChange?: (newQueryJson: string) => void\n /** If onQueryResultBundleChange is set, it will be called whenever the query result bundle changes */\n onQueryResultBundleChange?: (newQueryResultBundleJson: string) => void\n isInfinite?: boolean\n /** Whether the URL should update when the query is modified (deep linking). */\n shouldDeepLink?: boolean\n}>\n\n/**\n * Internal component that reads the current query metadata from QueryContext and fires\n * onQueryResultBundleChange whenever the data changes. Must be rendered as a child of\n * QueryContextProvider (i.e. inside SearchQueryWrapper).\n */\nfunction SearchQueryResultBundleChangeNotifier({\n onQueryResultBundleChange,\n}: {\n onQueryResultBundleChange: (json: string) => void\n}) {\n const { queryMetadataQueryOptions } = useQueryContext()\n // queryMetadataQueryOptions is UseSuspenseQueryOptions; cast to UseQueryOptions so we can use\n // regular (non-suspense) `useQuery` here — the same cache key is shared, so no extra request is made.\n const queryOpts = queryMetadataQueryOptions as UseQueryOptions<\n AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n SynapseClientError,\n Omit<QueryResultBundle, 'queryResult'>\n >\n const { data } = useQuery(queryOpts)\n useEffect(() => {\n if (data) {\n onQueryResultBundleChange(JSON.stringify(data))\n }\n }, [data, onQueryResultBundleChange])\n return null\n}\n\nfunction SearchQueryWrapperInternal(props: SearchQueryWrapperProps) {\n return (\n <SessionInitializedGuard>\n <SearchQueryWrapperInternalWithSession {...props} />\n </SessionInitializedGuard>\n )\n}\n\nfunction SearchQueryWrapperInternalWithSession(props: SearchQueryWrapperProps) {\n const {\n initQueryRequest: initQueryRequestFromProps,\n onQueryChange,\n onQueryResultBundleChange,\n isInfinite = false,\n searchIndexId,\n shouldDeepLink = false,\n } = props\n\n const { keyFactory, accessToken } = useSynapseContext()\n\n const { data: searchIndexEntityData } = useGetEntity(\n searchIndexId,\n undefined,\n {\n throwOnError: true,\n },\n )\n const searchIndexEntity = searchIndexEntityData as SearchIndex | undefined\n\n const synapseId = searchIndexEntity?.definingSQL\n ? parseEntityIdFromSqlStatement(searchIndexEntity.definingSQL)\n : undefined\n\n const { data: entityBundle } = useGetEntityBundle(\n synapseId,\n undefined,\n { includeTableBundle: true },\n { throwOnError: true },\n )\n const columnModels = entityBundle?.tableBundle?.columnModels\n\n // Build a full synthetic QueryBundleRequest so we can reuse useImmutableTableQuery.\n // The entityId and sql are placeholders; only selectedFacets, limit, offset, and partMask\n // are passed through to the actual SearchQueryServicesApi call.\n const initQueryRequest = useDeepCompareMemoize({\n concreteType:\n 'org.sagebionetworks.repo.model.table.QueryBundleRequest' as const,\n entityId: SEARCH_QUERY_WRAPPER_SYNTHETIC_ENTITY_ID,\n partMask: initQueryRequestFromProps.partMask ?? 0,\n query: {\n sql: SEARCH_QUERY_WRAPPER_SYNTHETIC_SQL,\n selectedFacets: initQueryRequestFromProps.query?.selectedFacets,\n additionalFilters: initQueryRequestFromProps.query?.additionalFilters,\n limit: initQueryRequestFromProps.query?.limit,\n offset: initQueryRequestFromProps.query?.offset,\n },\n }) as QueryBundleRequest\n\n const immutableTableQueryResult = useImmutableTableQuery({\n initQueryRequest,\n onQueryChange,\n shouldDeepLink,\n })\n\n const {\n getInitQueryRequest,\n getCurrentQueryRequest,\n setQuery,\n resetQuery,\n removeSelectedFacet,\n removeValueFromSelectedFacet,\n removeQueryFilter,\n removeValueFromQueryFilter,\n nextQueryRequest,\n currentQueryRequest,\n addValueToSelectedFacet,\n setRangeFacetValue,\n resetDebounceTimer,\n currentPage,\n goToPage,\n pageSize,\n setPageSize,\n } = immutableTableQueryResult\n\n // SearchTableQueryUseQueryOptions uses SearchIndexQuery generics rather than QueryBundleRequest.\n // QueryContextType (and all downstream consumers) expect TableQueryUseQueryOptions. The runtime\n // shapes are identical — only the TypeScript generics differ — so a single cast is made here at\n // the architectural boundary rather than scattering `as unknown as` across the implementation.\n const {\n rowDataQueryOptions,\n rowDataInfiniteQueryOptions,\n queryMetadataQueryOptions,\n } = useSearchQueryUseQueryOptions(\n currentQueryRequest as QueryBundleRequest,\n searchIndexId,\n synapseId,\n ) as unknown as TableQueryUseQueryOptions\n\n const hasFacetedSelectColumn = useHasFacetedSelectColumn(\n queryMetadataQueryOptions,\n )\n\n const hasResettableFilters = useMemo(() => {\n const request = getCurrentQueryRequest()\n return hasResettableFiltersUtil(request.query, undefined)\n }, [getCurrentQueryRequest])\n\n // Provides page-specific row query options using the search API, so components like\n // usePrefetchTableRows don't accidentally call the standard table query API with the\n // synthetic entity ID.\n const getRowDataQueryOptionsForPage = useCallback(\n (pageNumber: number) => {\n const queryWithUpdatedPage = transformQueryToGoToPage(\n { type: 'goToPage', pageNumber },\n cloneDeep(getCurrentQueryRequest()),\n )\n return (\n getSearchQueryUseQueryOptions(\n queryWithUpdatedPage,\n keyFactory,\n accessToken,\n searchIndexId,\n columnModels,\n ) as unknown as TableQueryUseQueryOptions\n ).rowDataQueryOptions\n },\n [\n getCurrentQueryRequest,\n keyFactory,\n accessToken,\n searchIndexId,\n columnModels,\n ],\n )\n\n // TODO: useDeepCompareMemoize cannot meaningfully compare functions — it falls back to\n // reference equality for them. The callbacks below (getCurrentQueryRequest, removeSelectedFacet,\n // getRowDataQueryOptionsForPage, etc.) behave identically to a shallow useMemo dep.\n // The correct fix is to deep-compare only serializable data fields and use a plain useMemo for\n // the full context object. QueryWrapper.tsx has the same issue; fix both together in a follow-up.\n const context: QueryContextType = useDeepCompareMemoize({\n isInfinite,\n entityId: undefined,\n versionNumber: undefined,\n nextQueryRequest,\n currentQueryRequest,\n getCurrentQueryRequest,\n getInitQueryRequest,\n executeQueryRequest: setQuery,\n hasFacetedSelectColumn,\n hasResettableFilters,\n removeSelectedFacet,\n removeValueFromSelectedFacet,\n resetQuery,\n removeQueryFilter,\n removeValueFromQueryFilter,\n onViewSharingSettingsClicked: undefined,\n addValueToSelectedFacet,\n combineRangeFacetConfig: undefined,\n setRangeFacetValue,\n resetDebounceTimer,\n rowDataQueryOptions,\n rowDataInfiniteQueryOptions,\n queryMetadataQueryOptions,\n currentPage,\n goToPage,\n pageSize,\n setPageSize,\n lockedColumn: undefined,\n fileIdColumnName: undefined,\n fileVersionColumnName: undefined,\n fileNameColumnName: undefined,\n getRowDataQueryOptionsForPage,\n })\n\n return (\n <QueryContextProvider queryContext={context}>\n {onQueryResultBundleChange && (\n <SearchQueryResultBundleChangeNotifier\n onQueryResultBundleChange={onQueryResultBundleChange}\n />\n )}\n {props.children}\n </QueryContextProvider>\n )\n}\n\n/**\n * Provides a QueryContext populated by results from the SearchQueryServicesApi rather than\n * the standard Table Query Services. All subcomponents that consume QueryContext can be\n * used unchanged within a SearchQueryWrapper tree.\n */\nexport function SearchQueryWrapper(props: SearchQueryWrapperProps) {\n return (\n <Provider>\n <SearchQueryWrapperInternal {...props} />\n </Provider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuCA,IAAa,IAA2C,UAC3C,IAAqC,iBAAiB;AAgCnE,SAAS,EAAsC,EAC7C,gCAGC;CACD,IAAM,EAAE,iCAA8B,GAAiB,EAQjD,EAAE,YAAS,EAAS,EAAU;AAMpC,QALA,QAAgB;AACd,EAAI,KACF,EAA0B,KAAK,UAAU,EAAK,CAAC;IAEhD,CAAC,GAAM,EAA0B,CAAC,EAC9B;;AAGT,SAAS,EAA2B,GAAgC;AAClE,QACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAuC,GAAI,GAAS,CAAA,EAC5B,CAAA;;AAI9B,SAAS,EAAsC,GAAgC;CAC7E,IAAM,EACJ,kBAAkB,GAClB,kBACA,8BACA,gBAAa,IACb,kBACA,oBAAiB,OACf,GAEE,EAAE,eAAY,mBAAgB,GAAmB,EAEjD,EAAE,MAAM,MAA0B,EACtC,GACA,KAAA,GACA,EACE,cAAc,IACf,CACF,EACK,IAAoB,GAEpB,IAAY,GAAmB,cACjC,EAA8B,EAAkB,YAAY,GAC5D,KAAA,GAEE,EAAE,MAAM,MAAiB,EAC7B,GACA,KAAA,GACA,EAAE,oBAAoB,IAAM,EAC5B,EAAE,cAAc,IAAM,CACvB,EACK,IAAe,GAAc,aAAa,cAyB1C,EACJ,wBACA,2BACA,aACA,eACA,wBACA,iCACA,sBACA,+BACA,qBACA,wBACA,4BACA,uBACA,uBACA,gBACA,UAAA,GACA,aACA,mBAvBgC,EAAuB;EACvD,kBAfuB,EAAsB;GAC7C,cACE;GACF,UAAU;GACV,UAAU,EAA0B,YAAY;GAChD,OAAO;IACL,KAAK;IACL,gBAAgB,EAA0B,OAAO;IACjD,mBAAmB,EAA0B,OAAO;IACpD,OAAO,EAA0B,OAAO;IACxC,QAAQ,EAA0B,OAAO;IAC1C;GACF,CAGC;EACA;EACA;EACD,CAoBG,EAME,EACJ,wBACA,gCACA,iCACE,EACF,GACA,GACA,EACD;AA+ED,QACE,kBAAC,GAAD;EAAsB,cApCU,EAAsB;GACtD;GACA,UAAU,KAAA;GACV,eAAe,KAAA;GACf;GACA;GACA;GACA;GACA,qBAAqB;GACrB,wBAnD6B,EAC7B,EAkDA;GACA,sBAhD2B,QAEpB,EADS,GACgB,CAAQ,OAAO,KAAA,EAAU,EACxD,CAAC,EAAuB,CA6CzB;GACA;GACA;GACA;GACA;GACA;GACA,8BAA8B,KAAA;GAC9B;GACA,yBAAyB,KAAA;GACzB;GACA;GACA;GACA;GACA;GACA;GACA,UAAA;GACA;GACA;GACA,cAAc,KAAA;GACd,kBAAkB,KAAA;GAClB,uBAAuB,KAAA;GACvB,oBAAoB,KAAA;GACpB,+BA9DoC,GACnC,MAMG,EAL2B,EAC3B;IAAE,MAAM;IAAY;IAAY,EAChC,EAAU,GAAwB,CAAC,CAIjC,EACA,GACA,GACA,GACA,EACD,CACD,qBAEJ;IACE;IACA;IACA;IACA;IACA;IACD,CAwCD;GACD,CAGqC;YAApC,CACG,KACC,kBAAC,GAAD,EAC6B,8BAC3B,CAAA,EAEH,EAAM,SACc;;;AAS3B,SAAgB,EAAmB,GAAgC;AACjE,QACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAA4B,GAAI,GAAS,CAAA,EAChC,CAAA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { CardConfiguration } from '../CardContainer/CardConfiguration';
|
|
2
|
+
import { QueryVisualizationWrapperProps } from '../QueryVisualizationWrapper';
|
|
3
|
+
import { SynapseTableConfiguration } from '../SynapseTable';
|
|
4
|
+
import { TopLevelControlsProps } from '../SynapseTable/TopLevelControls/TopLevelControls';
|
|
5
|
+
import { PlotsContainerProps } from '../widgets/facet-nav/PlotsContainer';
|
|
6
|
+
import { FacetFilterControlsProps } from '../widgets/query-filter/FacetFilterControls';
|
|
7
|
+
import { SearchQueryWrapperProps } from '../SearchQueryWrapper/SearchQueryWrapper';
|
|
8
|
+
type SearchQueryWrapperPlotNavOwnProps = {
|
|
9
|
+
/** The ID of the SearchIndex entity to query. */
|
|
10
|
+
searchIndexId: string;
|
|
11
|
+
/**
|
|
12
|
+
* The name of the field to use for autocomplete suggestions.
|
|
13
|
+
* When provided, the search bar will show a dropdown of suggestions as the user types,
|
|
14
|
+
* populated by querying the search index with this field restricted via POST /search/autocomplete.
|
|
15
|
+
*/
|
|
16
|
+
autocompleteFieldName?: string;
|
|
17
|
+
/** Whether the displayed results should be paginated or infinite. Default for cards is true, default for table is false */
|
|
18
|
+
isInfinite?: boolean;
|
|
19
|
+
tableConfiguration?: SynapseTableConfiguration;
|
|
20
|
+
cardConfiguration?: CardConfiguration;
|
|
21
|
+
facetsToPlot?: string[];
|
|
22
|
+
availableFacets?: FacetFilterControlsProps['availableFacets'];
|
|
23
|
+
initialExpandedFacetControls?: FacetFilterControlsProps['initialExpandedFacetControls'];
|
|
24
|
+
initialLimit?: number;
|
|
25
|
+
hideTopLevelControls?: boolean;
|
|
26
|
+
};
|
|
27
|
+
export type SearchQueryWrapperPlotNavProps = SearchQueryWrapperPlotNavOwnProps & PlotsContainerProps & Pick<QueryVisualizationWrapperProps, 'defaultShowPlots' | 'visibleColumnCount' | 'columnAliases' | 'rgbIndex' | 'showLastUpdatedOn' | 'noContentPlaceholderType' | 'unitDescription' | 'helpConfiguration' | 'hideCopyToClipboard' | 'hideVisualizationsControl'> & Pick<TopLevelControlsProps, 'name' | 'hideQueryCount'> & {
|
|
28
|
+
/** Optional initial query parameters. Only selectedFacets, additionalFilters, limit, and offset are used. */
|
|
29
|
+
initQueryRequest?: SearchQueryWrapperProps['initQueryRequest'];
|
|
30
|
+
/** Called when the query result bundle changes (e.g. to report result counts to a parent). */
|
|
31
|
+
onQueryResultBundleChange?: SearchQueryWrapperProps['onQueryResultBundleChange'];
|
|
32
|
+
/** Whether the URL should update when the query is modified (deep linking). */
|
|
33
|
+
shouldDeepLink?: SearchQueryWrapperProps['shouldDeepLink'];
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Type guard that identifies a SearchQueryWrapperPlotNavProps from the union
|
|
37
|
+
* `QueryWrapperPlotNavProps | SearchQueryWrapperPlotNavProps`.
|
|
38
|
+
*
|
|
39
|
+
* Two conditions are checked to be robust against future API changes:
|
|
40
|
+
* 1. The config has `searchIndexId` (present only on SearchQueryWrapperPlotNavProps).
|
|
41
|
+
* 2. The config does NOT have `sql` (always present on QueryWrapperPlotNavProps via
|
|
42
|
+
* QueryOrDeprecatedSearchParams), so that if QueryWrapperPlotNavProps ever gains a
|
|
43
|
+
* `searchIndexId` field the guard remains correct.
|
|
44
|
+
*/
|
|
45
|
+
export declare function isSearchQueryWrapperPlotNavProps(config: {
|
|
46
|
+
searchIndexId?: unknown;
|
|
47
|
+
sql?: unknown;
|
|
48
|
+
}): config is SearchQueryWrapperPlotNavProps;
|
|
49
|
+
/**
|
|
50
|
+
* A component similar to QueryWrapperPlotNav that sources its data from the SearchQueryServicesApi
|
|
51
|
+
* rather than the standard Synapse Table Services. Facets, table/card rendering, and plots are
|
|
52
|
+
* all reused from the existing component library.
|
|
53
|
+
*/
|
|
54
|
+
export default function SearchQueryWrapperPlotNav(props: SearchQueryWrapperPlotNavProps): import("react/jsx-runtime").JSX.Element;
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=SearchQueryWrapperPlotNav.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchQueryWrapperPlotNav.d.ts","sourceRoot":"","sources":["../../../src/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAEL,8BAA8B,EAC/B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAA;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAA;AACtF,OAAO,EAEL,uBAAuB,EACxB,MAAM,0CAA0C,CAAA;AAIjD,KAAK,iCAAiC,GAAG;IACvC,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,2HAA2H;IAC3H,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,kBAAkB,CAAC,EAAE,yBAAyB,CAAA;IAC9C,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,eAAe,CAAC,EAAE,wBAAwB,CAAC,iBAAiB,CAAC,CAAA;IAC7D,4BAA4B,CAAC,EAAE,wBAAwB,CAAC,8BAA8B,CAAC,CAAA;IACvF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAI/B,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG,iCAAiC,GAC5E,mBAAmB,GACnB,IAAI,CACF,8BAA8B,EAC5B,kBAAkB,GAClB,oBAAoB,GACpB,eAAe,GACf,UAAU,GACV,mBAAmB,GACnB,0BAA0B,GAC1B,iBAAiB,GACjB,mBAAmB,GACnB,qBAAqB,GACrB,2BAA2B,CAC9B,GACD,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,gBAAgB,CAAC,GAAG;IACvD,6GAA6G;IAC7G,gBAAgB,CAAC,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAA;IAC9D,8FAA8F;IAC9F,yBAAyB,CAAC,EAAE,uBAAuB,CAAC,2BAA2B,CAAC,CAAA;IAChF,+EAA+E;IAC/E,cAAc,CAAC,EAAE,uBAAuB,CAAC,gBAAgB,CAAC,CAAA;CAC3D,CAAA;AAEH;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE;IACvD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd,GAAG,MAAM,IAAI,8BAA8B,CAE3C;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAC/C,KAAK,EAAE,8BAA8B,2CAiGtC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import "../../utils/SynapseConstants.js";
|
|
2
|
+
import { NoContentPlaceholderType as e } from "../SynapseTable/NoContentPlaceholderType.js";
|
|
3
|
+
import { QueryVisualizationWrapper as t } from "../QueryVisualizationWrapper/QueryVisualizationWrapper.js";
|
|
4
|
+
import "../QueryVisualizationWrapper/index.js";
|
|
5
|
+
import n from "../QueryWrapper/QueryWrapperLoadingScreen.js";
|
|
6
|
+
import { QueryWrapperPlotNavContents as r } from "../QueryWrapperPlotNav/QueryWrapperPlotNav.js";
|
|
7
|
+
import { useGetSuggestionsForSearchIndex as i } from "../SearchQueryWrapper/SearchQueryUseQueryOptions.js";
|
|
8
|
+
import { SearchQueryWrapper as a } from "../SearchQueryWrapper/SearchQueryWrapper.js";
|
|
9
|
+
import { Suspense as o, useRef as s } from "react";
|
|
10
|
+
import { jsx as c } from "react/jsx-runtime";
|
|
11
|
+
import { useDeepCompareMemoize as l } from "use-deep-compare-effect";
|
|
12
|
+
//#region src/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.tsx
|
|
13
|
+
function u(e) {
|
|
14
|
+
return "searchIndexId" in e && !("sql" in e);
|
|
15
|
+
}
|
|
16
|
+
function d(u) {
|
|
17
|
+
let { tableConfiguration: d, isInfinite: f = !d, unitDescription: p, helpConfiguration: m, initQueryRequest: h, onQueryResultBundleChange: g, searchIndexId: _, autocompleteFieldName: v, shouldDeepLink: y } = u, b = i(_, v), x = l({
|
|
18
|
+
partMask: h?.partMask ?? 0,
|
|
19
|
+
query: {
|
|
20
|
+
selectedFacets: h?.query?.selectedFacets,
|
|
21
|
+
additionalFilters: h?.query?.additionalFilters,
|
|
22
|
+
limit: h?.query?.limit ?? 25,
|
|
23
|
+
offset: h?.query?.offset ?? 0
|
|
24
|
+
}
|
|
25
|
+
}), S = s(0), C = s(x);
|
|
26
|
+
return C.current !== x && (S.current += 1, C.current = x), /* @__PURE__ */ c(a, {
|
|
27
|
+
searchIndexId: _,
|
|
28
|
+
initQueryRequest: x,
|
|
29
|
+
isInfinite: f,
|
|
30
|
+
onQueryResultBundleChange: g,
|
|
31
|
+
shouldDeepLink: y,
|
|
32
|
+
children: /* @__PURE__ */ c(o, {
|
|
33
|
+
fallback: /* @__PURE__ */ c(n, {}),
|
|
34
|
+
children: /* @__PURE__ */ c(t, {
|
|
35
|
+
unitDescription: p,
|
|
36
|
+
rgbIndex: u.rgbIndex,
|
|
37
|
+
columnAliases: u.columnAliases,
|
|
38
|
+
helpConfiguration: m,
|
|
39
|
+
visibleColumnCount: u.visibleColumnCount,
|
|
40
|
+
defaultShowPlots: u.defaultShowPlots,
|
|
41
|
+
hideCopyToClipboard: u.hideCopyToClipboard,
|
|
42
|
+
hideSearchBarControl: !1,
|
|
43
|
+
defaultShowSearchBar: !0,
|
|
44
|
+
showLastUpdatedOn: u.showLastUpdatedOn,
|
|
45
|
+
noContentPlaceholderType: u.noContentPlaceholderType ?? e.INTERACTIVE,
|
|
46
|
+
children: /* @__PURE__ */ c(r, {
|
|
47
|
+
tableConfiguration: d,
|
|
48
|
+
name: u.name,
|
|
49
|
+
cardConfiguration: u.cardConfiguration,
|
|
50
|
+
facetsToPlot: u.facetsToPlot,
|
|
51
|
+
availableFacets: u.availableFacets,
|
|
52
|
+
initialExpandedFacetControls: u.initialExpandedFacetControls,
|
|
53
|
+
hideDownload: !0,
|
|
54
|
+
hideQueryCount: u.hideQueryCount ?? !1,
|
|
55
|
+
hideSqlEditorControl: !0,
|
|
56
|
+
hideVisualizationsControl: u.hideVisualizationsControl,
|
|
57
|
+
initialLimit: u.initialLimit,
|
|
58
|
+
initialPlotTypeByFacetColumnName: u.initialPlotTypeByFacetColumnName,
|
|
59
|
+
hideTopLevelControls: u.hideTopLevelControls,
|
|
60
|
+
isFullTextSearchEnabled: !0,
|
|
61
|
+
searchConfiguration: { ftsConfig: {
|
|
62
|
+
textMatchesMode: "NATURAL_LANGUAGE",
|
|
63
|
+
getSuggestions: v ? b : void 0
|
|
64
|
+
} }
|
|
65
|
+
})
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
}, S.current);
|
|
69
|
+
}
|
|
70
|
+
//#endregion
|
|
71
|
+
export { d as default, u as isSearchQueryWrapperPlotNavProps };
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=SearchQueryWrapperPlotNav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchQueryWrapperPlotNav.js","names":[],"sources":["../../../src/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.tsx"],"sourcesContent":["import { NoContentPlaceholderType } from '@/components/SynapseTable/NoContentPlaceholderType'\nimport { DEFAULT_PAGE_SIZE } from '@/utils/SynapseConstants'\nimport { Suspense, useRef } from 'react'\nimport { useDeepCompareMemoize } from 'use-deep-compare-effect'\nimport { CardConfiguration } from '../CardContainer/CardConfiguration'\nimport {\n QueryVisualizationWrapper,\n QueryVisualizationWrapperProps,\n} from '../QueryVisualizationWrapper'\nimport QueryWrapperLoadingScreen from '../QueryWrapper/QueryWrapperLoadingScreen'\nimport { SynapseTableConfiguration } from '../SynapseTable'\nimport { TopLevelControlsProps } from '../SynapseTable/TopLevelControls/TopLevelControls'\nimport { PlotsContainerProps } from '../widgets/facet-nav/PlotsContainer'\nimport { FacetFilterControlsProps } from '../widgets/query-filter/FacetFilterControls'\nimport {\n SearchQueryWrapper,\n SearchQueryWrapperProps,\n} from '../SearchQueryWrapper/SearchQueryWrapper'\nimport { QueryWrapperPlotNavContents } from '../QueryWrapperPlotNav/QueryWrapperPlotNav'\nimport { useGetSuggestionsForSearchIndex } from '../SearchQueryWrapper/SearchQueryUseQueryOptions'\n\ntype SearchQueryWrapperPlotNavOwnProps = {\n /** The ID of the SearchIndex entity to query. */\n searchIndexId: string\n /**\n * The name of the field to use for autocomplete suggestions.\n * When provided, the search bar will show a dropdown of suggestions as the user types,\n * populated by querying the search index with this field restricted via POST /search/autocomplete.\n */\n autocompleteFieldName?: string\n /** Whether the displayed results should be paginated or infinite. Default for cards is true, default for table is false */\n isInfinite?: boolean\n tableConfiguration?: SynapseTableConfiguration\n cardConfiguration?: CardConfiguration\n facetsToPlot?: string[]\n availableFacets?: FacetFilterControlsProps['availableFacets']\n initialExpandedFacetControls?: FacetFilterControlsProps['initialExpandedFacetControls']\n initialLimit?: number\n hideTopLevelControls?: boolean\n // Note: hideDownload, hideSqlEditorControl are intentionally\n // excluded — they are hardcoded to true because these controls are not applicable to the\n // SearchQueryServicesApi (no file download, no SQL editing).\n}\n\nexport type SearchQueryWrapperPlotNavProps = SearchQueryWrapperPlotNavOwnProps &\n PlotsContainerProps &\n Pick<\n QueryVisualizationWrapperProps,\n | 'defaultShowPlots'\n | 'visibleColumnCount'\n | 'columnAliases'\n | 'rgbIndex'\n | 'showLastUpdatedOn'\n | 'noContentPlaceholderType'\n | 'unitDescription'\n | 'helpConfiguration'\n | 'hideCopyToClipboard'\n | 'hideVisualizationsControl'\n > &\n Pick<TopLevelControlsProps, 'name' | 'hideQueryCount'> & {\n /** Optional initial query parameters. Only selectedFacets, additionalFilters, limit, and offset are used. */\n initQueryRequest?: SearchQueryWrapperProps['initQueryRequest']\n /** Called when the query result bundle changes (e.g. to report result counts to a parent). */\n onQueryResultBundleChange?: SearchQueryWrapperProps['onQueryResultBundleChange']\n /** Whether the URL should update when the query is modified (deep linking). */\n shouldDeepLink?: SearchQueryWrapperProps['shouldDeepLink']\n }\n\n/**\n * Type guard that identifies a SearchQueryWrapperPlotNavProps from the union\n * `QueryWrapperPlotNavProps | SearchQueryWrapperPlotNavProps`.\n *\n * Two conditions are checked to be robust against future API changes:\n * 1. The config has `searchIndexId` (present only on SearchQueryWrapperPlotNavProps).\n * 2. The config does NOT have `sql` (always present on QueryWrapperPlotNavProps via\n * QueryOrDeprecatedSearchParams), so that if QueryWrapperPlotNavProps ever gains a\n * `searchIndexId` field the guard remains correct.\n */\nexport function isSearchQueryWrapperPlotNavProps(config: {\n searchIndexId?: unknown\n sql?: unknown\n}): config is SearchQueryWrapperPlotNavProps {\n return 'searchIndexId' in config && !('sql' in config)\n}\n\n/**\n * A component similar to QueryWrapperPlotNav that sources its data from the SearchQueryServicesApi\n * rather than the standard Synapse Table Services. Facets, table/card rendering, and plots are\n * all reused from the existing component library.\n */\nexport default function SearchQueryWrapperPlotNav(\n props: SearchQueryWrapperPlotNavProps,\n) {\n const {\n tableConfiguration,\n isInfinite = !tableConfiguration,\n unitDescription,\n helpConfiguration,\n initQueryRequest: initQueryRequestFromProps,\n onQueryResultBundleChange,\n searchIndexId,\n autocompleteFieldName,\n shouldDeepLink,\n } = props\n\n const getSuggestions = useGetSuggestionsForSearchIndex(\n searchIndexId,\n autocompleteFieldName,\n )\n\n const initQueryRequest: SearchQueryWrapperProps['initQueryRequest'] =\n useDeepCompareMemoize({\n partMask: initQueryRequestFromProps?.partMask ?? 0,\n query: {\n selectedFacets: initQueryRequestFromProps?.query?.selectedFacets,\n additionalFilters: initQueryRequestFromProps?.query?.additionalFilters,\n limit: initQueryRequestFromProps?.query?.limit ?? DEFAULT_PAGE_SIZE,\n offset: initQueryRequestFromProps?.query?.offset ?? 0,\n },\n })\n\n // Remount SearchQueryWrapper when initQueryRequest content changes.\n // useDeepCompareMemoize returns the same reference when content is equal, so reference\n // comparison is sufficient here. A counter is used rather than JSON.stringify to avoid\n // serializing the object on every render.\n const mountKeyRef = useRef(0)\n const prevInitQueryRef = useRef(initQueryRequest)\n if (prevInitQueryRef.current !== initQueryRequest) {\n mountKeyRef.current += 1\n prevInitQueryRef.current = initQueryRequest\n }\n\n return (\n <SearchQueryWrapper\n key={mountKeyRef.current}\n searchIndexId={searchIndexId}\n initQueryRequest={initQueryRequest}\n isInfinite={isInfinite}\n onQueryResultBundleChange={onQueryResultBundleChange}\n shouldDeepLink={shouldDeepLink}\n >\n <Suspense fallback={<QueryWrapperLoadingScreen />}>\n <QueryVisualizationWrapper\n unitDescription={unitDescription}\n rgbIndex={props.rgbIndex}\n columnAliases={props.columnAliases}\n helpConfiguration={helpConfiguration}\n visibleColumnCount={props.visibleColumnCount}\n defaultShowPlots={props.defaultShowPlots}\n hideCopyToClipboard={props.hideCopyToClipboard}\n hideSearchBarControl={false}\n defaultShowSearchBar={true}\n showLastUpdatedOn={props.showLastUpdatedOn}\n noContentPlaceholderType={\n props.noContentPlaceholderType ??\n NoContentPlaceholderType.INTERACTIVE\n }\n >\n <QueryWrapperPlotNavContents\n tableConfiguration={tableConfiguration}\n name={props.name}\n cardConfiguration={props.cardConfiguration}\n facetsToPlot={props.facetsToPlot}\n availableFacets={props.availableFacets}\n initialExpandedFacetControls={props.initialExpandedFacetControls}\n hideDownload={true}\n hideQueryCount={props.hideQueryCount ?? false}\n hideSqlEditorControl={true}\n hideVisualizationsControl={props.hideVisualizationsControl}\n initialLimit={props.initialLimit}\n initialPlotTypeByFacetColumnName={\n props.initialPlotTypeByFacetColumnName\n }\n hideTopLevelControls={props.hideTopLevelControls}\n isFullTextSearchEnabled={true}\n searchConfiguration={{\n ftsConfig: {\n textMatchesMode: 'NATURAL_LANGUAGE',\n getSuggestions: autocompleteFieldName\n ? getSuggestions\n : undefined,\n },\n }}\n />\n </QueryVisualizationWrapper>\n </Suspense>\n </SearchQueryWrapper>\n )\n}\n"],"mappings":";;;;;;;;;;;;AA8EA,SAAgB,EAAiC,GAGJ;AAC3C,QAAO,mBAAmB,KAAU,EAAE,SAAS;;AAQjD,SAAwB,EACtB,GACA;CACA,IAAM,EACJ,uBACA,gBAAa,CAAC,GACd,oBACA,sBACA,kBAAkB,GAClB,8BACA,kBACA,0BACA,sBACE,GAEE,IAAiB,EACrB,GACA,EACD,EAEK,IACJ,EAAsB;EACpB,UAAU,GAA2B,YAAY;EACjD,OAAO;GACL,gBAAgB,GAA2B,OAAO;GAClD,mBAAmB,GAA2B,OAAO;GACrD,OAAO,GAA2B,OAAO,SAAA;GACzC,QAAQ,GAA2B,OAAO,UAAU;GACrD;EACF,CAAC,EAME,IAAc,EAAO,EAAE,EACvB,IAAmB,EAAO,EAAiB;AAMjD,QALI,EAAiB,YAAY,MAC/B,EAAY,WAAW,GACvB,EAAiB,UAAU,IAI3B,kBAAC,GAAD;EAEiB;EACG;EACN;EACe;EACX;YAEhB,kBAAC,GAAD;GAAU,UAAU,kBAAC,GAAD,EAA6B,CAAA;aAC/C,kBAAC,GAAD;IACmB;IACjB,UAAU,EAAM;IAChB,eAAe,EAAM;IACF;IACnB,oBAAoB,EAAM;IAC1B,kBAAkB,EAAM;IACxB,qBAAqB,EAAM;IAC3B,sBAAsB;IACtB,sBAAsB;IACtB,mBAAmB,EAAM;IACzB,0BACE,EAAM,4BACN,EAAyB;cAG3B,kBAAC,GAAD;KACsB;KACpB,MAAM,EAAM;KACZ,mBAAmB,EAAM;KACzB,cAAc,EAAM;KACpB,iBAAiB,EAAM;KACvB,8BAA8B,EAAM;KACpC,cAAc;KACd,gBAAgB,EAAM,kBAAkB;KACxC,sBAAsB;KACtB,2BAA2B,EAAM;KACjC,cAAc,EAAM;KACpB,kCACE,EAAM;KAER,sBAAsB,EAAM;KAC5B,yBAAyB;KACzB,qBAAqB,EACnB,WAAW;MACT,iBAAiB;MACjB,gBAAgB,IACZ,IACA,KAAA;MACL,EACF;KACD,CAAA;IACwB,CAAA;GACnB,CAAA;EACQ,EApDd,EAAY,QAoDE"}
|
|
@@ -27,7 +27,7 @@ var C = ({ shortIoPublicApiKey: C, domain: w = "sageb.io", renderAs: T = "button
|
|
|
27
27
|
N && I();
|
|
28
28
|
}, [N, I]), /* @__PURE__ */ m("div", { children: [T === "button" && /* @__PURE__ */ p(o, {
|
|
29
29
|
variant: "outlined",
|
|
30
|
-
|
|
30
|
+
startIcon: /* @__PURE__ */ p(h, { className: t.shareIcon }),
|
|
31
31
|
onClick: P,
|
|
32
32
|
children: "Share"
|
|
33
33
|
}), /* @__PURE__ */ m(s, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShareThisPage.js","names":[],"sources":["../../../src/components/ShareThisPage/ShareThisPage.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n IconButton,\n Typography,\n Input,\n Box,\n} from '@mui/material'\nimport React from 'react'\nimport { useEffect, useState } from 'react'\nimport CloseIcon from '@mui/icons-material/Close'\nimport CopyToClipboardIcon from '../CopyToClipboardIcon'\nimport {\n LinkedinShareButton,\n LinkedinIcon,\n TwitterShareButton,\n BlueskyShareButton,\n BlueskyIcon,\n XIcon,\n} from 'react-share'\nimport styles from './ShareThisPage.module.scss'\nimport { ShareTwoTone } from '@mui/icons-material'\nimport { useCreateShortUrl } from '../../utils/hooks/useCreateShortUrl'\n\nexport type ShareThisPageProps = {\n shortIoPublicApiKey?: string\n domain?: string\n renderAs?: 'button' | 'icon'\n open?: boolean\n onClose?: () => void\n}\n\nconst ShareThisPage = ({\n shortIoPublicApiKey,\n domain = 'sageb.io',\n renderAs = 'button',\n open: externalOpen,\n onClose: externalOnClose,\n}: ShareThisPageProps): React.ReactNode => {\n const [url, setUrl] = useState('')\n const [internalOpen, setInternalOpen] = useState(false)\n\n // Use internal state if externalOpen is undefined\n // Otherwise, the open state is controlled externally by externalOpen\n const isControlled = externalOpen === undefined\n const open = isControlled ? internalOpen : externalOpen\n\n const handleOpen = () => {\n if (isControlled) {\n setInternalOpen(true)\n }\n }\n\n const handleClose = () => {\n if (isControlled) {\n setInternalOpen(false)\n }\n if (externalOnClose) {\n externalOnClose()\n }\n }\n\n const { mutate: createShortUrl, isPending } = useCreateShortUrl({\n shortIoPublicApiKey,\n domain,\n onSuccess: data => {\n setUrl(data)\n },\n onError: error => {\n console.error(error)\n setUrl(window.location.href)\n },\n })\n\n useEffect(() => {\n if (open) {\n createShortUrl()\n }\n }, [open, createShortUrl])\n\n return (\n <div>\n {renderAs === 'button' && (\n <Button\n variant=\"outlined\"\n
|
|
1
|
+
{"version":3,"file":"ShareThisPage.js","names":[],"sources":["../../../src/components/ShareThisPage/ShareThisPage.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n IconButton,\n Typography,\n Input,\n Box,\n} from '@mui/material'\nimport React from 'react'\nimport { useEffect, useState } from 'react'\nimport CloseIcon from '@mui/icons-material/Close'\nimport CopyToClipboardIcon from '../CopyToClipboardIcon'\nimport {\n LinkedinShareButton,\n LinkedinIcon,\n TwitterShareButton,\n BlueskyShareButton,\n BlueskyIcon,\n XIcon,\n} from 'react-share'\nimport styles from './ShareThisPage.module.scss'\nimport { ShareTwoTone } from '@mui/icons-material'\nimport { useCreateShortUrl } from '../../utils/hooks/useCreateShortUrl'\n\nexport type ShareThisPageProps = {\n shortIoPublicApiKey?: string\n domain?: string\n renderAs?: 'button' | 'icon'\n open?: boolean\n onClose?: () => void\n}\n\nconst ShareThisPage = ({\n shortIoPublicApiKey,\n domain = 'sageb.io',\n renderAs = 'button',\n open: externalOpen,\n onClose: externalOnClose,\n}: ShareThisPageProps): React.ReactNode => {\n const [url, setUrl] = useState('')\n const [internalOpen, setInternalOpen] = useState(false)\n\n // Use internal state if externalOpen is undefined\n // Otherwise, the open state is controlled externally by externalOpen\n const isControlled = externalOpen === undefined\n const open = isControlled ? internalOpen : externalOpen\n\n const handleOpen = () => {\n if (isControlled) {\n setInternalOpen(true)\n }\n }\n\n const handleClose = () => {\n if (isControlled) {\n setInternalOpen(false)\n }\n if (externalOnClose) {\n externalOnClose()\n }\n }\n\n const { mutate: createShortUrl, isPending } = useCreateShortUrl({\n shortIoPublicApiKey,\n domain,\n onSuccess: data => {\n setUrl(data)\n },\n onError: error => {\n console.error(error)\n setUrl(window.location.href)\n },\n })\n\n useEffect(() => {\n if (open) {\n createShortUrl()\n }\n }, [open, createShortUrl])\n\n return (\n <div>\n {renderAs === 'button' && (\n <Button\n variant=\"outlined\"\n startIcon={<ShareTwoTone className={styles.shareIcon} />}\n onClick={handleOpen}\n >\n Share\n </Button>\n )}\n\n <Dialog\n open={open}\n onClose={handleClose}\n maxWidth=\"xs\"\n className={styles.dialogPaper}\n >\n <DialogTitle className={styles.dialogTitle}>\n Share this page\n <IconButton onClick={handleClose} size=\"small\">\n <CloseIcon className={styles.closeIcon} />\n </IconButton>\n </DialogTitle>\n\n <DialogContent className={styles.dialogContent}>\n <Box className={styles.contentStack}>\n <div className={styles.shareButtonsContainer}>\n <LinkedinShareButton url={url} aria-label=\"Share on LinkedIn\">\n <div className={styles.shareItem}>\n <LinkedinIcon size={48} round />\n <Typography variant=\"body1\" className={styles.shareItemLabel}>\n LinkedIn\n </Typography>\n </div>\n </LinkedinShareButton>\n\n <TwitterShareButton url={url} aria-label=\"Share on X\">\n <div className={styles.shareItem}>\n <XIcon size={48} round />\n <Typography variant=\"body1\" className={styles.shareItemLabel}>\n X\n </Typography>\n </div>\n </TwitterShareButton>\n\n <BlueskyShareButton url={url} aria-label=\"Share on Bluesky\">\n <div className={styles.shareItem}>\n <BlueskyIcon size={48} round />\n <Typography variant=\"body1\" className={styles.shareItemLabel}>\n Bluesky\n </Typography>\n </div>\n </BlueskyShareButton>\n </div>\n\n <div className={styles.copySection}>\n <Typography className={styles.copyLabel}>Page Link</Typography>\n <div className={styles.copyRow}>\n <Input\n className={styles.urlInput}\n value={url}\n readOnly\n aria-label=\"Page URL\"\n placeholder={isPending ? 'Generating link...' : ''}\n />\n <CopyToClipboardIcon\n value={url}\n sizePx={24}\n className={styles.copyButton}\n />\n </div>\n </div>\n </Box>\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n\nexport default ShareThisPage\n"],"mappings":";;;;;;;;;;AAkCA,IAAM,KAAiB,EACrB,wBACA,YAAS,YACT,cAAW,UACX,MAAM,GACN,SAAS,QACgC;CACzC,IAAM,CAAC,GAAK,KAAU,EAAS,GAAG,EAC5B,CAAC,GAAc,KAAmB,EAAS,GAAM,EAIjD,IAAe,MAAiB,KAAA,GAChC,IAAO,IAAe,IAAe,GAErC,UAAmB;AACvB,EAAI,KACF,EAAgB,GAAK;IAInB,UAAoB;AAIxB,EAHI,KACF,EAAgB,GAAM,EAEpB,KACF,GAAiB;IAIf,EAAE,QAAQ,GAAgB,iBAAc,EAAkB;EAC9D;EACA;EACA,YAAW,MAAQ;AACjB,KAAO,EAAK;;EAEd,UAAS,MAAS;AAEhB,GADA,QAAQ,MAAM,EAAM,EACpB,EAAO,OAAO,SAAS,KAAK;;EAE/B,CAAC;AAQF,QANA,QAAgB;AACd,EAAI,KACF,GAAgB;IAEjB,CAAC,GAAM,EAAe,CAAC,EAGxB,kBAAC,OAAD,EAAA,UAAA,CACG,MAAa,YACZ,kBAAC,GAAD;EACE,SAAQ;EACR,WAAW,kBAAC,GAAD,EAAc,WAAW,EAAO,WAAa,CAAA;EACxD,SAAS;YACV;EAEQ,CAAA,EAGX,kBAAC,GAAD;EACQ;EACN,SAAS;EACT,UAAS;EACT,WAAW,EAAO;YAJpB,CAME,kBAAC,GAAD;GAAa,WAAW,EAAO;aAA/B,CAA4C,mBAE1C,kBAAC,GAAD;IAAY,SAAS;IAAa,MAAK;cACrC,kBAAC,GAAD,EAAW,WAAW,EAAO,WAAa,CAAA;IAC/B,CAAA,CACD;MAEd,kBAAC,GAAD;GAAe,WAAW,EAAO;aAC/B,kBAAC,GAAD;IAAK,WAAW,EAAO;cAAvB,CACE,kBAAC,OAAD;KAAK,WAAW,EAAO;eAAvB;MACE,kBAAC,GAAD;OAA0B;OAAK,cAAW;iBACxC,kBAAC,OAAD;QAAK,WAAW,EAAO;kBAAvB,CACE,kBAAC,GAAD;SAAc,MAAM;SAAI,OAAA;SAAQ,CAAA,EAChC,kBAAC,GAAD;SAAY,SAAQ;SAAQ,WAAW,EAAO;mBAAgB;SAEjD,CAAA,CACT;;OACc,CAAA;MAEtB,kBAAC,GAAD;OAAyB;OAAK,cAAW;iBACvC,kBAAC,OAAD;QAAK,WAAW,EAAO;kBAAvB,CACE,kBAAC,GAAD;SAAO,MAAM;SAAI,OAAA;SAAQ,CAAA,EACzB,kBAAC,GAAD;SAAY,SAAQ;SAAQ,WAAW,EAAO;mBAAgB;SAEjD,CAAA,CACT;;OACa,CAAA;MAErB,kBAAC,GAAD;OAAyB;OAAK,cAAW;iBACvC,kBAAC,OAAD;QAAK,WAAW,EAAO;kBAAvB,CACE,kBAAC,GAAD;SAAa,MAAM;SAAI,OAAA;SAAQ,CAAA,EAC/B,kBAAC,GAAD;SAAY,SAAQ;SAAQ,WAAW,EAAO;mBAAgB;SAEjD,CAAA,CACT;;OACa,CAAA;MACjB;QAEN,kBAAC,OAAD;KAAK,WAAW,EAAO;eAAvB,CACE,kBAAC,GAAD;MAAY,WAAW,EAAO;gBAAW;MAAsB,CAAA,EAC/D,kBAAC,OAAD;MAAK,WAAW,EAAO;gBAAvB,CACE,kBAAC,GAAD;OACE,WAAW,EAAO;OAClB,OAAO;OACP,UAAA;OACA,cAAW;OACX,aAAa,IAAY,uBAAuB;OAChD,CAAA,EACF,kBAAC,GAAD;OACE,OAAO;OACP,QAAQ;OACR,WAAW,EAAO;OAClB,CAAA,CACE;QACF;OACF;;GACQ,CAAA,CACT;IACL,EAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridAgentChat.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseChat/GridAgentChat.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GridAgentChat.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseChat/GridAgentChat.tsx"],"names":[],"mappings":"AAaA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAA;AAED,wBAAgB,aAAa,CAAC,EAC5B,aAAa,EACb,cAAc,EACd,WAA8B,EAC9B,cAAc,EACd,IAAI,EACJ,OAAO,EACP,mBAAmB,GACpB,EAAE,kBAAkB,2CAgCpB;AAED,eAAe,aAAa,CAAA"}
|
|
@@ -6,32 +6,38 @@ import { useState as r } from "react";
|
|
|
6
6
|
import { jsx as i } from "react/jsx-runtime";
|
|
7
7
|
import { AgentAccessLevel as a } from "@sage-bionetworks/synapse-types";
|
|
8
8
|
//#region src/components/SynapseChat/GridAgentChat.tsx
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
var o = [
|
|
10
|
+
"Help me fill this out",
|
|
11
|
+
"Help me understand this",
|
|
12
|
+
"Find missing fields"
|
|
13
|
+
];
|
|
14
|
+
function s({ gridSessionId: s, usersReplicaId: c, chatbotName: l = "Grid Assistant", initialMessage: u, open: d, onClose: f, agentRegistrationId: p }) {
|
|
15
|
+
let [m, h] = r(), g = e(m);
|
|
11
16
|
return /* @__PURE__ */ i(n, {
|
|
12
|
-
open:
|
|
13
|
-
onClose:
|
|
14
|
-
title:
|
|
17
|
+
open: d,
|
|
18
|
+
onClose: f,
|
|
19
|
+
title: l,
|
|
15
20
|
children: /* @__PURE__ */ i(t, {
|
|
16
|
-
agentRegistrationId:
|
|
17
|
-
chatbotName:
|
|
18
|
-
initialMessage:
|
|
21
|
+
agentRegistrationId: p,
|
|
22
|
+
chatbotName: l,
|
|
23
|
+
initialMessage: u,
|
|
19
24
|
sessionContext: {
|
|
20
25
|
concreteType: "org.sagebionetworks.repo.model.agent.GridAgentSessionContext",
|
|
21
|
-
gridSessionId:
|
|
22
|
-
usersReplicaId:
|
|
26
|
+
gridSessionId: s,
|
|
27
|
+
usersReplicaId: c
|
|
23
28
|
},
|
|
24
29
|
textboxPositionOffset: "16px",
|
|
25
30
|
hideTitle: !0,
|
|
26
31
|
showAccessLevelMenu: !1,
|
|
27
32
|
defaultAgentAccessLevel: a.WRITE_YOUR_PRIVATE_DATA,
|
|
28
|
-
externalSession:
|
|
29
|
-
setExternalSession:
|
|
30
|
-
externalChatState:
|
|
33
|
+
externalSession: m,
|
|
34
|
+
setExternalSession: h,
|
|
35
|
+
externalChatState: g,
|
|
36
|
+
suggestedPrompts: o
|
|
31
37
|
})
|
|
32
38
|
});
|
|
33
39
|
}
|
|
34
40
|
//#endregion
|
|
35
|
-
export {
|
|
41
|
+
export { s as GridAgentChat, s as default };
|
|
36
42
|
|
|
37
43
|
//# sourceMappingURL=GridAgentChat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridAgentChat.js","names":[],"sources":["../../../src/components/SynapseChat/GridAgentChat.tsx"],"sourcesContent":["import { useChatState } from '@/components/SynapseChat/useChatState'\nimport { GridAgentSessionContext } from '@sage-bionetworks/synapse-client'\nimport { AgentAccessLevel, AgentSession } from '@sage-bionetworks/synapse-types'\nimport { useState } from 'react'\nimport DraggableDialog from '../DraggableDialog/DraggableDialog'\nimport { SynapseChat } from './index'\n\nexport type GridAgentChatProps = {\n gridSessionId: string\n usersReplicaId: number\n chatbotName?: string\n initialMessage?: string\n open: boolean\n onClose: () => void\n /** Optional ID to use a different agent registered in Synapse */\n agentRegistrationId?: string\n}\n\nexport function GridAgentChat({\n gridSessionId,\n usersReplicaId,\n chatbotName = 'Grid Assistant',\n initialMessage,\n open,\n onClose,\n agentRegistrationId,\n}: GridAgentChatProps) {\n // Storing state for the chat session here preserves chat history while the dialog is opened and closed.\n const [agentSession, setAgentSession] = useState<AgentSession | undefined>()\n const chatState = useChatState(agentSession)\n\n // Create session context for grid sessions\n const sessionContext: GridAgentSessionContext = {\n concreteType:\n 'org.sagebionetworks.repo.model.agent.GridAgentSessionContext',\n gridSessionId,\n usersReplicaId,\n }\n\n return (\n <DraggableDialog open={open} onClose={onClose} title={chatbotName}>\n <SynapseChat\n agentRegistrationId={agentRegistrationId}\n chatbotName={chatbotName}\n initialMessage={initialMessage}\n sessionContext={sessionContext}\n textboxPositionOffset=\"16px\"\n hideTitle={true}\n showAccessLevelMenu={false}\n defaultAgentAccessLevel={AgentAccessLevel.WRITE_YOUR_PRIVATE_DATA}\n // lift state: allow GridAgentChat to control the agent session and interactions\n externalSession={agentSession}\n setExternalSession={setAgentSession}\n externalChatState={chatState}\n />\n </DraggableDialog>\n )\n}\n\nexport default GridAgentChat\n"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"GridAgentChat.js","names":[],"sources":["../../../src/components/SynapseChat/GridAgentChat.tsx"],"sourcesContent":["import { useChatState } from '@/components/SynapseChat/useChatState'\nimport { GridAgentSessionContext } from '@sage-bionetworks/synapse-client'\nimport { AgentAccessLevel, AgentSession } from '@sage-bionetworks/synapse-types'\nimport { useState } from 'react'\nimport DraggableDialog from '../DraggableDialog/DraggableDialog'\nimport { SynapseChat } from './index'\n\nconst suggestedPrompts = [\n 'Help me fill this out',\n 'Help me understand this',\n 'Find missing fields',\n]\n\nexport type GridAgentChatProps = {\n gridSessionId: string\n usersReplicaId: number\n chatbotName?: string\n initialMessage?: string\n open: boolean\n onClose: () => void\n /** Optional ID to use a different agent registered in Synapse */\n agentRegistrationId?: string\n}\n\nexport function GridAgentChat({\n gridSessionId,\n usersReplicaId,\n chatbotName = 'Grid Assistant',\n initialMessage,\n open,\n onClose,\n agentRegistrationId,\n}: GridAgentChatProps) {\n // Storing state for the chat session here preserves chat history while the dialog is opened and closed.\n const [agentSession, setAgentSession] = useState<AgentSession | undefined>()\n const chatState = useChatState(agentSession)\n\n // Create session context for grid sessions\n const sessionContext: GridAgentSessionContext = {\n concreteType:\n 'org.sagebionetworks.repo.model.agent.GridAgentSessionContext',\n gridSessionId,\n usersReplicaId,\n }\n\n return (\n <DraggableDialog open={open} onClose={onClose} title={chatbotName}>\n <SynapseChat\n agentRegistrationId={agentRegistrationId}\n chatbotName={chatbotName}\n initialMessage={initialMessage}\n sessionContext={sessionContext}\n textboxPositionOffset=\"16px\"\n hideTitle={true}\n showAccessLevelMenu={false}\n defaultAgentAccessLevel={AgentAccessLevel.WRITE_YOUR_PRIVATE_DATA}\n // lift state: allow GridAgentChat to control the agent session and interactions\n externalSession={agentSession}\n setExternalSession={setAgentSession}\n externalChatState={chatState}\n suggestedPrompts={suggestedPrompts}\n />\n </DraggableDialog>\n )\n}\n\nexport default GridAgentChat\n"],"mappings":";;;;;;;;AAOA,IAAM,IAAmB;CACvB;CACA;CACA;CACD;AAaD,SAAgB,EAAc,EAC5B,kBACA,mBACA,iBAAc,kBACd,mBACA,SACA,YACA,0BACqB;CAErB,IAAM,CAAC,GAAc,KAAmB,GAAoC,EACtE,IAAY,EAAa,EAAa;AAU5C,QACE,kBAAC,GAAD;EAAuB;EAAe;EAAS,OAAO;YACpD,kBAAC,GAAD;GACuB;GACR;GACG;GACA,gBAAA;IAZpB,cACE;IACF;IACA;IASoB;GAChB,uBAAsB;GACtB,WAAW;GACX,qBAAqB;GACrB,yBAAyB,EAAiB;GAE1C,iBAAiB;GACjB,oBAAoB;GACpB,mBAAmB;GACD;GAClB,CAAA;EACc,CAAA"}
|
|
@@ -19,6 +19,8 @@ export type SynapseChatProps = {
|
|
|
19
19
|
* Called in the mutation onSuccess handler so it runs exactly once per response.
|
|
20
20
|
*/
|
|
21
21
|
onChatResponse?: (responseText: string) => void;
|
|
22
|
+
/** Optional list of prompt suggestions shown as clickable pills above the text input */
|
|
23
|
+
suggestedPrompts?: string[];
|
|
22
24
|
};
|
|
23
25
|
export type ChatInteraction = {
|
|
24
26
|
userMessage: string;
|
|
@@ -29,6 +31,6 @@ export type ChatInteraction = {
|
|
|
29
31
|
export type TraceEventWithFriendlyMessage = {
|
|
30
32
|
friendlyMessage?: string;
|
|
31
33
|
} & TraceEvent;
|
|
32
|
-
export declare function SynapseChat({ initialMessage, agentRegistrationId, chatbotName, hideTitle, textboxPositionOffset, sessionContext, externalSession, setExternalSession, externalChatState, showAccessLevelMenu, onChatResponse, }: SynapseChatProps): import("react/jsx-runtime").JSX.Element;
|
|
34
|
+
export declare function SynapseChat({ initialMessage, agentRegistrationId, chatbotName, hideTitle, textboxPositionOffset, sessionContext, externalSession, setExternalSession, externalChatState, showAccessLevelMenu, onChatResponse, suggestedPrompts, }: SynapseChatProps): import("react/jsx-runtime").JSX.Element;
|
|
33
35
|
export default SynapseChat;
|
|
34
36
|
//# sourceMappingURL=SynapseChat.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SynapseChat.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseChat/SynapseChat.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,uCAAuC,CAAA;
|
|
1
|
+
{"version":3,"file":"SynapseChat.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseChat/SynapseChat.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,uCAAuC,CAAA;AAmB/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAA;AAC1E,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACX,MAAM,iCAAiC,CAAA;AAQxC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAE9B,cAAc,CAAC,EAAE,uBAAuB,CAAA;IAExC,eAAe,CAAC,EAAE,YAAY,CAAA;IAE9B,kBAAkB,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,GAAG,SAAS,KAAK,IAAI,CAAA;IAE1D,iBAAiB,CAAC,EAAE,SAAS,CAAA;IAE7B,uBAAuB,CAAC,EAAE,gBAAgB,CAAA;IAE1C,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/C,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,CAAC,EAAE,6BAA6B,EAAE,CAAA;CACpD,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,GAAG,UAAU,CAAA;AAEd,wBAAgB,WAAW,CAAC,EAC1B,cAAc,EACd,mBAAmB,EACnB,WAA2B,EAC3B,SAAiB,EACjB,qBAA6B,EAC7B,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,mBAA0B,EAC1B,cAAc,EACd,gBAAgB,GACjB,EAAE,gBAAgB,2CA+QlB;AAED,eAAe,WAAW,CAAA"}
|