@gooddata/sdk-ui-gen-ai 11.53.0-alpha.5 → 11.53.0-alpha.7
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/esm/components/ConfigContext.d.ts.map +1 -1
- package/esm/components/ConfigContext.js +8 -15
- package/esm/components/GenAIChat.d.ts.map +1 -1
- package/esm/components/GenAIChat.js +3 -4
- package/esm/components/GenAiChatContextChooser.d.ts.map +1 -1
- package/esm/components/GenAiChatContextChooser.js +4 -3
- package/esm/components/GenAiChatContextChooserBody.d.ts +3 -1
- package/esm/components/GenAiChatContextChooserBody.d.ts.map +1 -1
- package/esm/components/GenAiChatContextChooserBody.js +19 -20
- package/esm/components/GenAiStore.d.ts.map +1 -1
- package/esm/components/GenAiStore.js +18 -2
- package/esm/components/hooks/useContextItems.d.ts +2 -0
- package/esm/components/hooks/useContextItems.d.ts.map +1 -1
- package/esm/components/hooks/useContextItems.js +25 -7
- package/esm/components/hooks/useInputAutofocus.d.ts.map +1 -1
- package/esm/components/hooks/useInputAutofocus.js +13 -2
- package/esm/components/intelligence/panel/IntelligenceTimeline.d.ts +2 -1
- package/esm/components/intelligence/panel/IntelligenceTimeline.d.ts.map +1 -1
- package/esm/components/intelligence/panel/IntelligenceTimeline.js +7 -0
- package/esm/store/chatWindow/chatWindowSelectors.d.ts +2 -0
- package/esm/store/chatWindow/chatWindowSelectors.d.ts.map +1 -1
- package/esm/store/chatWindow/chatWindowSelectors.js +3 -0
- package/esm/store/chatWindow/chatWindowSlice.d.ts +7 -1
- package/esm/store/chatWindow/chatWindowSlice.d.ts.map +1 -1
- package/esm/store/chatWindow/chatWindowSlice.js +14 -2
- package/esm/store/options.d.ts +2 -0
- package/esm/store/options.d.ts.map +1 -1
- package/esm/store/options.js +16 -1
- package/esm/store/sideEffects/index.d.ts.map +1 -1
- package/esm/store/sideEffects/index.js +3 -2
- package/esm/store/sideEffects/loadContextObjects.d.ts +7 -0
- package/esm/store/sideEffects/loadContextObjects.d.ts.map +1 -1
- package/esm/store/sideEffects/loadContextObjects.js +26 -8
- package/esm/store/store.d.ts +10 -1
- package/esm/store/store.d.ts.map +1 -1
- package/esm/store/store.js +2 -0
- package/esm/types.d.ts +1 -0
- package/esm/types.d.ts.map +1 -1
- package/package.json +20 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigContext.d.ts","sourceRoot":"","sources":["../../src/components/ConfigContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAsC,MAAM,OAAO,CAAC;AAEnF,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE7G,MAAM,MAAM,aAAa,GAAG;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,CAAC;IACvE,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,EAAE,SAAS,GAAG,eAAe,CAAC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACpC,aAAa,CAAC,EAAE,QAAQ,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAC3C,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,YAAY,CAAC;AAIzD,wBAAgB,cAAc,CAAC,EAC3B,QAAQ,EACR,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,SAAS,EACT,UAAU,EACV,cAAc,EACjB,EAAE,iBAAiB,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"ConfigContext.d.ts","sourceRoot":"","sources":["../../src/components/ConfigContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAsC,MAAM,OAAO,CAAC;AAEnF,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE7G,MAAM,MAAM,aAAa,GAAG;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,CAAC;IACvE,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,EAAE,SAAS,GAAG,eAAe,CAAC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACpC,aAAa,CAAC,EAAE,QAAQ,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAC3C,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,YAAY,CAAC;AAIzD,wBAAgB,cAAc,CAAC,EAC3B,QAAQ,EACR,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,SAAS,EACT,UAAU,EACV,cAAc,EACjB,EAAE,iBAAiB,CAAC,aAAa,CAAC,2CAsBlC;AAED,eAAO,MAAM,SAAS,qBAErB,CAAC"}
|
|
@@ -6,25 +6,18 @@ export function ConfigProvider({ children, allowNativeLinks, linkHandler, catalo
|
|
|
6
6
|
const parentConfig = useConfig();
|
|
7
7
|
const value = useMemo(() => ({
|
|
8
8
|
allowNativeLinks: allowNativeLinks ?? parentConfig.allowNativeLinks,
|
|
9
|
-
linkHandler: linkHandler
|
|
9
|
+
linkHandler: linkHandler
|
|
10
|
+
? (event) => {
|
|
11
|
+
const resultParent = parentConfig.linkHandler?.(event);
|
|
12
|
+
const resultCurrent = linkHandler?.(event);
|
|
13
|
+
return resultCurrent ?? resultParent;
|
|
14
|
+
}
|
|
15
|
+
: parentConfig.linkHandler,
|
|
10
16
|
catalogItems: catalogItems ?? parentConfig.catalogItems,
|
|
11
17
|
canManage: canManage ?? parentConfig.canManage,
|
|
12
18
|
canAnalyze: canAnalyze ?? parentConfig.canAnalyze,
|
|
13
19
|
canFullControl: canFullControl ?? parentConfig.canFullControl,
|
|
14
|
-
}), [
|
|
15
|
-
allowNativeLinks,
|
|
16
|
-
parentConfig.allowNativeLinks,
|
|
17
|
-
parentConfig.linkHandler,
|
|
18
|
-
parentConfig.catalogItems,
|
|
19
|
-
parentConfig.canManage,
|
|
20
|
-
parentConfig.canAnalyze,
|
|
21
|
-
parentConfig.canFullControl,
|
|
22
|
-
linkHandler,
|
|
23
|
-
catalogItems,
|
|
24
|
-
canManage,
|
|
25
|
-
canAnalyze,
|
|
26
|
-
canFullControl,
|
|
27
|
-
]);
|
|
20
|
+
}), [allowNativeLinks, parentConfig, linkHandler, catalogItems, canManage, canAnalyze, canFullControl]);
|
|
28
21
|
return _jsx(configContext.Provider, { value: value, children: children });
|
|
29
22
|
}
|
|
30
23
|
export const useConfig = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenAIChat.d.ts","sourceRoot":"","sources":["../../src/components/GenAIChat.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAQ3C,OAAO,
|
|
1
|
+
{"version":3,"file":"GenAIChat.d.ts","sourceRoot":"","sources":["../../src/components/GenAIChat.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAQ3C,OAAO,EAAkB,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGpG,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEnE;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GAAG;IAClE;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,CAAC;IAEvE;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,8BAA8B,CAAC,EAAE,MAAM,aAAa,CAAC;IAErD;;OAEG;IACH,2BAA2B,CAAC,EAAE,MAAM,aAAa,GAAG,IAAI,CAAC;IAEzD;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAE1B;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACrD,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CAyDxD;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,uBAAiB,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { BackendProvider, WorkspaceProvider, useBackendStrict, useWorkspaceStric
|
|
|
3
3
|
import { IntlWrapper } from "../localization/IntlWrapper.js";
|
|
4
4
|
import { PermissionsProvider } from "../permissions/PermissionsContext.js";
|
|
5
5
|
import { usePermissions } from "../permissions/usePermissions.js";
|
|
6
|
-
import { ConfigProvider
|
|
6
|
+
import { ConfigProvider } from "./ConfigContext.js";
|
|
7
7
|
import { CustomizationProvider } from "./CustomizationProvider.js";
|
|
8
8
|
import { GenAIChatWrapper } from "./GenAIChatWrapper.js";
|
|
9
9
|
import { GenAiStore } from "./GenAiStore.js";
|
|
@@ -24,8 +24,7 @@ export function GenAIAssistant(props) {
|
|
|
24
24
|
*/
|
|
25
25
|
export const GenAIChat = GenAIAssistant;
|
|
26
26
|
function GenAIContent(props) {
|
|
27
|
-
const {
|
|
27
|
+
const { LandingScreenComponentProvider, DisclaimerComponentProvider, className, catalogItems } = props;
|
|
28
28
|
const { permissions, loading } = usePermissions();
|
|
29
|
-
|
|
30
|
-
return (_jsx(ConfigProvider, { linkHandler: onLinkClick, catalogItems: catalogItems, allowNativeLinks: allowNativeLinks ?? props.allowNativeLinks, canFullControl: props.disableFullControl ? false : (permissions.canManageProject ?? false), canManage: props.disableManage ? false : (permissions.canManageProject ?? false), canAnalyze: props.disableAnalyze ? false : (permissions.canCreateVisualization ?? false), children: _jsx(CustomizationProvider, { landingScreenComponentProvider: LandingScreenComponentProvider, disclaimerComponentProvider: DisclaimerComponentProvider, children: _jsx(GenAIChatWrapper, { initializing: loading, className: className }) }) }));
|
|
29
|
+
return (_jsx(ConfigProvider, { catalogItems: catalogItems, canFullControl: props.disableFullControl ? false : (permissions.canManageProject ?? false), canManage: props.disableManage ? false : (permissions.canManageProject ?? false), canAnalyze: props.disableAnalyze ? false : (permissions.canCreateVisualization ?? false), children: _jsx(CustomizationProvider, { landingScreenComponentProvider: LandingScreenComponentProvider, disclaimerComponentProvider: DisclaimerComponentProvider, children: _jsx(GenAIChatWrapper, { initializing: loading, className: className }) }) }));
|
|
31
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenAiChatContextChooser.d.ts","sourceRoot":"","sources":["../../src/components/GenAiChatContextChooser.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAWvD,KAAK,+BAA+B,GAAG;IACnC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACzD,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,EAAE,YAAY,EAAE,EAAE,+BAA+B,
|
|
1
|
+
{"version":3,"file":"GenAiChatContextChooser.d.ts","sourceRoot":"","sources":["../../src/components/GenAiChatContextChooser.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAWvD,KAAK,+BAA+B,GAAG;IACnC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACzD,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,EAAE,YAAY,EAAE,EAAE,+BAA+B,kDA4ExF"}
|
|
@@ -19,20 +19,21 @@ export function GenAiChatContextChooser({ onAddContext }) {
|
|
|
19
19
|
const titleId = useIdPrefixed("context-chooser-title");
|
|
20
20
|
const ambient = useSelector((state) => ambientContextSelector(state));
|
|
21
21
|
const active = useSelector((state) => userContextSelector(state));
|
|
22
|
-
const { items: inputItems, isLoading, hasNextPage, loadNextPage } = useContextItems(ambient, active);
|
|
22
|
+
const { items: inputItems, search, setSearch, isLoading, hasNextPage, loadNextPage, } = useContextItems(ambient, active);
|
|
23
23
|
const addContextLabel = intl.formatMessage(msgs.add);
|
|
24
24
|
const onOpenStateChanged = useCallback((isOpen) => {
|
|
25
|
+
setSearch("");
|
|
25
26
|
if (isOpen) {
|
|
26
27
|
dispatch(initContextObjectsAction());
|
|
27
28
|
}
|
|
28
|
-
}, [dispatch]);
|
|
29
|
+
}, [dispatch, setSearch]);
|
|
29
30
|
if (!ambient) {
|
|
30
31
|
return null;
|
|
31
32
|
}
|
|
32
33
|
return (_jsx("div", { className: "gd-gen-ai-chat__input__context", children: _jsx(Dropdown, { alignPoints: [{ align: "tl bl", offset: { x: 0, y: 0 } }], closeOnEscape: true, fullscreenOnMobile: false, autofocusOnOpen: true, accessibilityConfig: {}, onOpenStateChanged: onOpenStateChanged, renderButton: ({ isOpen, toggleDropdown, accessibilityConfig }) => (_jsx(UiIconButton, { icon: "plus", variant: "tertiary", size: "small", dataTestId: "choose_context", isActive: isOpen, accessibilityConfig: {
|
|
33
34
|
...accessibilityConfig,
|
|
34
35
|
ariaLabel: addContextLabel,
|
|
35
|
-
}, onClick: toggleDropdown, isDisabled: !inputItems.length && !hasNextPage && !isLoading })), renderBody: ({ closeDropdown, ariaAttributes }) => (_jsx(GenAiChatContextChooserBody, { inputItems: inputItems, title: addContextLabel, titleId: titleId, isLoading: isLoading, hasNextPage: hasNextPage, loadNextPage: loadNextPage, ariaAttributes: ariaAttributes, closeDropdown: closeDropdown, onSelect: (item) => {
|
|
36
|
+
}, onClick: toggleDropdown, isDisabled: !search && !inputItems.length && !hasNextPage && !isLoading })), renderBody: ({ closeDropdown, ariaAttributes }) => (_jsx(GenAiChatContextChooserBody, { inputItems: inputItems, title: addContextLabel, titleId: titleId, search: search, onSearchChange: setSearch, isLoading: isLoading, hasNextPage: hasNextPage, loadNextPage: loadNextPage, ariaAttributes: ariaAttributes, closeDropdown: closeDropdown, onSelect: (item) => {
|
|
36
37
|
dispatch(addContextReferenceAction({ object: item }));
|
|
37
38
|
onAddContext?.(item);
|
|
38
39
|
} })) }) }));
|
|
@@ -3,6 +3,8 @@ type GenAiChatContextChooserBodyProps = {
|
|
|
3
3
|
inputItems: IGenAIContextObject[];
|
|
4
4
|
title: string;
|
|
5
5
|
titleId: string;
|
|
6
|
+
search: string;
|
|
7
|
+
onSearchChange: (search: string) => void;
|
|
6
8
|
isLoading?: boolean;
|
|
7
9
|
hasNextPage?: boolean;
|
|
8
10
|
loadNextPage?: () => void;
|
|
@@ -14,6 +16,6 @@ type GenAiChatContextChooserBodyProps = {
|
|
|
14
16
|
onSelect: (item: IGenAIContextObject) => void;
|
|
15
17
|
closeDropdown: () => void;
|
|
16
18
|
};
|
|
17
|
-
export declare function GenAiChatContextChooserBody({ inputItems, title, titleId, isLoading, hasNextPage, loadNextPage, ariaAttributes, onSelect, closeDropdown }: GenAiChatContextChooserBodyProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export declare function GenAiChatContextChooserBody({ inputItems, title, titleId, search, onSearchChange, isLoading, hasNextPage, loadNextPage, ariaAttributes, onSelect, closeDropdown }: GenAiChatContextChooserBodyProps): import("react/jsx-runtime").JSX.Element;
|
|
18
20
|
export {};
|
|
19
21
|
//# sourceMappingURL=GenAiChatContextChooserBody.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenAiChatContextChooserBody.d.ts","sourceRoot":"","sources":["../../src/components/GenAiChatContextChooserBody.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GenAiChatContextChooserBody.d.ts","sourceRoot":"","sources":["../../src/components/GenAiChatContextChooserBody.tsx"],"names":[],"mappings":"AAuBA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AA8BvD,KAAK,gCAAgC,GAAG;IACpC,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,QAAQ,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC9C,aAAa,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,EACxC,UAAU,EACV,KAAK,EACL,OAAO,EACP,MAAM,EACN,cAAc,EACd,SAAiB,EACjB,WAAmB,EACnB,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,aAAa,EAChB,EAAE,gCAAgC,2CAmIlC"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// (C) 2026 GoodData Corporation
|
|
3
|
-
import { useCallback,
|
|
3
|
+
import { useCallback, useEffect, useId } from "react";
|
|
4
4
|
import cx from "classnames";
|
|
5
5
|
import { defineMessages, useIntl } from "react-intl";
|
|
6
|
+
import { useDebouncedState } from "@gooddata/sdk-ui";
|
|
6
7
|
import { DEFAULT_ITEM_HEIGHT, DETAILED_ANNOUNCEMENT_THRESHOLD, Input, NoData, ScopedIdStore, ShortenedText, UiIcon, UiPagedVirtualList, UiSearchResultsAnnouncement, UiSubmenuHeader, isTypingKey, useScopedIdStoreValue, } from "@gooddata/sdk-ui-kit";
|
|
7
8
|
import { getIconByType } from "./utils/icons.js";
|
|
8
9
|
const SEARCH_FIELD_VISIBILITY_THRESHOLD = 7;
|
|
10
|
+
const SEARCH_DEBOUNCE_MS = 300;
|
|
9
11
|
const MAX_VISIBLE_ITEMS = 7;
|
|
10
12
|
const LOADING_SKELETON_ITEMS_COUNT = 3;
|
|
11
13
|
const msgs = defineMessages({
|
|
@@ -28,25 +30,23 @@ const msgs = defineMessages({
|
|
|
28
30
|
id: "gd.gen-ai.context.noDataAvailable",
|
|
29
31
|
},
|
|
30
32
|
});
|
|
31
|
-
export function GenAiChatContextChooserBody({ inputItems, title, titleId, isLoading = false, hasNextPage = false, loadNextPage, ariaAttributes, onSelect, closeDropdown, }) {
|
|
33
|
+
export function GenAiChatContextChooserBody({ inputItems, title, titleId, search, onSearchChange, isLoading = false, hasNextPage = false, loadNextPage, ariaAttributes, onSelect, closeDropdown, }) {
|
|
32
34
|
const intl = useIntl();
|
|
33
35
|
const listboxId = useId();
|
|
34
|
-
const [searchString, setSearchString] =
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const filteredItems = useMemo(() => {
|
|
39
|
-
if (!normalizedSearch) {
|
|
40
|
-
return inputItems;
|
|
36
|
+
const [searchString, setSearchString, debouncedSearch] = useDebouncedState(search, SEARCH_DEBOUNCE_MS);
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (debouncedSearch.trim() !== search) {
|
|
39
|
+
onSearchChange(debouncedSearch.trim());
|
|
41
40
|
}
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
}, [debouncedSearch, search, onSearchChange]);
|
|
42
|
+
const isSearchFieldVisible = inputItems.length > SEARCH_FIELD_VISIBILITY_THRESHOLD || searchString.length > 0 || hasNextPage;
|
|
43
|
+
const normalizedSearch = search.trim().toLowerCase();
|
|
44
44
|
const scopedIdStoreValue = useScopedIdStoreValue((item) => `${item.type}-${item.id}`);
|
|
45
45
|
const handleSelect = useCallback((item) => {
|
|
46
46
|
onSelect(item);
|
|
47
47
|
closeDropdown();
|
|
48
48
|
}, [closeDropdown, onSelect]);
|
|
49
|
-
const hasNoData = !isLoading &&
|
|
49
|
+
const hasNoData = !isLoading && inputItems.length === 0;
|
|
50
50
|
const hasNoMatchingData = hasNoData && normalizedSearch.length > 0;
|
|
51
51
|
const searchFilled = searchString.length > 0;
|
|
52
52
|
const onEscKeyPress = useCallback((event) => {
|
|
@@ -57,10 +57,9 @@ export function GenAiChatContextChooserBody({ inputItems, title, titleId, isLoad
|
|
|
57
57
|
closeDropdown();
|
|
58
58
|
}
|
|
59
59
|
}, [closeDropdown, searchFilled]);
|
|
60
|
-
const
|
|
61
|
-
const
|
|
62
|
-
const
|
|
63
|
-
const visibleRowsCount = filteredItems.length + skeletonItemsCount;
|
|
60
|
+
const shouldShowPagedList = !hasNoData || hasNextPage;
|
|
61
|
+
const skeletonItemsCount = isLoading || (hasNextPage && inputItems.length === 0) ? LOADING_SKELETON_ITEMS_COUNT : 0;
|
|
62
|
+
const visibleRowsCount = inputItems.length + skeletonItemsCount;
|
|
64
63
|
const listMaxHeight = Math.min(Math.max(visibleRowsCount, 1), MAX_VISIBLE_ITEMS) * DEFAULT_ITEM_HEIGHT;
|
|
65
64
|
return (_jsxs("div", { ...ariaAttributes, "aria-labelledby": titleId, className: "gd-gen-ai-chat__context-chooser", "data-testid": "context_chooser_menu", children: [
|
|
66
65
|
_jsx(UiSubmenuHeader, { title: title, titleId: titleId, height: "medium", onClose: closeDropdown, closeAriaLabel: intl.formatMessage(msgs.close) }), isSearchFieldVisible ? (_jsxs(_Fragment, { children: [
|
|
@@ -68,13 +67,13 @@ export function GenAiChatContextChooserBody({ inputItems, title, titleId, isLoad
|
|
|
68
67
|
if (isTypingKey(event)) {
|
|
69
68
|
event.stopPropagation();
|
|
70
69
|
}
|
|
71
|
-
}, children: _jsx(Input, { className: cx("gd-list-searchfield", "gd-flex-item"), value:
|
|
70
|
+
}, children: _jsx(Input, { className: cx("gd-list-searchfield", "gd-flex-item"), value: searchString, onChange: (value) => setSearchString(String(value)), onEscKeyPress: onEscKeyPress, placeholder: intl.formatMessage(msgs.searchPlaceholder), autofocus: true, clearOnEsc: true, isSearch: true, isSmall: true, type: "search", accessibilityConfig: {
|
|
72
71
|
ariaLabel: intl.formatMessage(msgs.searchAriaLabel),
|
|
73
72
|
ariaControls: listboxId,
|
|
74
|
-
} }) }), _jsx(UiSearchResultsAnnouncement, { totalResults: normalizedSearch ?
|
|
75
|
-
?
|
|
73
|
+
} }) }), _jsx(UiSearchResultsAnnouncement, { totalResults: normalizedSearch ? inputItems.length : undefined, resultValues: inputItems.length <= DETAILED_ANNOUNCEMENT_THRESHOLD
|
|
74
|
+
? inputItems.map((item) => item.title)
|
|
76
75
|
: undefined })
|
|
77
|
-
] })) : null, shouldShowPagedList ? (_jsx(ScopedIdStore, { value: scopedIdStoreValue, children: _jsx(UiPagedVirtualList, { maxHeight: listMaxHeight, items:
|
|
76
|
+
] })) : null, shouldShowPagedList ? (_jsx(ScopedIdStore, { value: scopedIdStoreValue, children: _jsx(UiPagedVirtualList, { maxHeight: listMaxHeight, items: inputItems, itemHeight: DEFAULT_ITEM_HEIGHT, itemsGap: 0, itemPadding: 0, skeletonItemsCount: skeletonItemsCount, isLoading: isLoading, hasNextPage: hasNextPage, loadNextPage: loadNextPage, representAs: "listbox", closeDropdown: closeDropdown, onKeyDownConfirm: handleSelect, listboxProps: {
|
|
78
77
|
id: listboxId,
|
|
79
78
|
"aria-label": intl.formatMessage(msgs.listAriaLabel),
|
|
80
79
|
}, children: (item) => _jsx(ContextChooserItem, { item: item, onSelect: () => handleSelect(item) }) }) })) : (_jsx(NoData, { hasNoMatchingData: hasNoMatchingData, notFoundLabel: intl.formatMessage(msgs.noMatchingData), noDataLabel: intl.formatMessage(msgs.noDataAvailable) }))] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenAiStore.d.ts","sourceRoot":"","sources":["../../src/components/GenAiStore.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAmC,MAAM,OAAO,CAAC;AAExE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACxB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"GenAiStore.d.ts","sourceRoot":"","sources":["../../src/components/GenAiStore.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAmC,MAAM,OAAO,CAAC;AAExE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACxB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAI3D,OAAO,EAAkB,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEpG;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC1B;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B;;OAEG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B;;;OAGG;IACH,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAChC;;;OAGG;IACH,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAElC;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,CAAC;IACvE;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;OAEG;IACH,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACnC;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;OAEG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B;;;;OAIG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;IAC7D;;OAEG;IACH,QAAQ,EAAE,SAAS,GAAG,CAAC,CAAC,UAAU,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC;IAEjE;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;;;OAOG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;CAC1C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,kDAmDhD"}
|
|
@@ -45,17 +45,33 @@ export function GenAiStore(props) {
|
|
|
45
45
|
}
|
|
46
46
|
return (_jsx(ConfigProvider, { allowNativeLinks: props.allowNativeLinks, linkHandler: props.onLinkClick, children: _jsx(InternalStore, { ...props, children: children }) }));
|
|
47
47
|
}
|
|
48
|
-
function ExternalStore({ onDispatcher, children, currentStore, }) {
|
|
48
|
+
function ExternalStore({ onDispatcher, children, currentStore, onLinkClick, }) {
|
|
49
49
|
useEffect(() => {
|
|
50
50
|
onDispatcher?.(currentStore.dispatch);
|
|
51
51
|
}, [currentStore, onDispatcher]);
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
const store = currentStore;
|
|
54
|
+
const dispatcher = store.optionsDispatcher;
|
|
55
|
+
if (dispatcher && onLinkClick) {
|
|
56
|
+
return dispatcher.registerLinkHandler(onLinkClick);
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}, [currentStore, onLinkClick]);
|
|
52
60
|
const content = typeof children === "function" ? children(currentStore) : children;
|
|
53
61
|
return _jsx(_Fragment, { children: content });
|
|
54
62
|
}
|
|
55
|
-
function InjectedStore({ onDispatcher, children, currentStore, }) {
|
|
63
|
+
function InjectedStore({ onDispatcher, children, currentStore, onLinkClick, }) {
|
|
56
64
|
useEffect(() => {
|
|
57
65
|
onDispatcher?.(currentStore.dispatch);
|
|
58
66
|
}, [currentStore, onDispatcher]);
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
const store = currentStore;
|
|
69
|
+
const dispatcher = store.optionsDispatcher;
|
|
70
|
+
if (dispatcher && onLinkClick) {
|
|
71
|
+
return dispatcher.registerLinkHandler(onLinkClick);
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}, [currentStore, onLinkClick]);
|
|
59
75
|
const content = typeof children === "function" ? children(currentStore) : children;
|
|
60
76
|
return _jsx(StoreProvider, { store: currentStore, children: content });
|
|
61
77
|
}
|
|
@@ -2,6 +2,8 @@ import { type IGenAIUserContext } from "@gooddata/sdk-model";
|
|
|
2
2
|
import { type IGenAIContextObject } from "../../types.js";
|
|
3
3
|
export declare function useContextItems(ambient: IGenAIUserContext | undefined, active: IGenAIUserContext | undefined): {
|
|
4
4
|
items: IGenAIContextObject[];
|
|
5
|
+
search: string;
|
|
6
|
+
setSearch: (value: string) => void;
|
|
5
7
|
isLoading: boolean;
|
|
6
8
|
hasNextPage: boolean;
|
|
7
9
|
loadNextPage: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useContextItems.d.ts","sourceRoot":"","sources":["../../../src/components/hooks/useContextItems.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,iBAAiB,EAAmB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"useContextItems.d.ts","sourceRoot":"","sources":["../../../src/components/hooks/useContextItems.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,iBAAiB,EAAmB,MAAM,qBAAqB,CAAC;AAc9E,OAAO,EAIH,KAAK,mBAAmB,EAC3B,MAAM,gBAAgB,CAAC;AAExB,wBAAgB,eAAe,CAC3B,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,MAAM,EAAE,iBAAiB,GAAG,SAAS;;;;;;;EAqExC"}
|
|
@@ -4,31 +4,39 @@ import { useIntl } from "react-intl";
|
|
|
4
4
|
import { useDispatch, useSelector } from "react-redux";
|
|
5
5
|
import { serializeObjRef } from "@gooddata/sdk-model";
|
|
6
6
|
import { collectAvailableReferences, collectContextReferences, } from "../../context/collectContextReferences.js";
|
|
7
|
-
import { contextObjectsSelector } from "../../store/chatWindow/chatWindowSelectors.js";
|
|
8
|
-
import { loadContextObjectsNextPageAction } from "../../store/chatWindow/chatWindowSlice.js";
|
|
7
|
+
import { contextObjectsSearchSelector, contextObjectsSelector, } from "../../store/chatWindow/chatWindowSelectors.js";
|
|
8
|
+
import { loadContextObjectsNextPageAction, setContextObjectsSearchAction, } from "../../store/chatWindow/chatWindowSlice.js";
|
|
9
9
|
export function useContextItems(ambient, active) {
|
|
10
10
|
const intl = useIntl();
|
|
11
11
|
const dispatch = useDispatch();
|
|
12
12
|
const emptyReferenceLabel = intl.formatMessage({ id: "gd.gen-ai.context.untitled" });
|
|
13
13
|
const contextObjects = useSelector(contextObjectsSelector);
|
|
14
|
+
const search = useSelector(contextObjectsSearchSelector);
|
|
14
15
|
const dashboards = contextObjects.dashboard;
|
|
15
16
|
const visualizations = contextObjects.visualization;
|
|
16
17
|
const items = useMemo(() => {
|
|
17
|
-
const
|
|
18
|
+
const matchesSearch = titleMatcher(search);
|
|
19
|
+
const ambientReferences = collectAvailableReferences(ambient, emptyReferenceLabel).filter(matchesSearch);
|
|
18
20
|
const selectedReferences = collectContextReferences(active, emptyReferenceLabel);
|
|
19
21
|
const offered = new Set();
|
|
20
|
-
|
|
22
|
+
collectAvailableReferences(ambient, emptyReferenceLabel).forEach((reference) => {
|
|
21
23
|
offered.add(serializeObjRef(reference.ref));
|
|
22
24
|
if (reference.insightRef) {
|
|
23
25
|
offered.add(serializeObjRef(reference.insightRef));
|
|
24
26
|
}
|
|
25
27
|
});
|
|
26
28
|
const workspaceReferences = [
|
|
27
|
-
...
|
|
28
|
-
...
|
|
29
|
+
...searchable(dashboards, "dashboard", emptyReferenceLabel, matchesSearch),
|
|
30
|
+
...searchable(visualizations, "visualization", emptyReferenceLabel, matchesSearch),
|
|
29
31
|
].filter((reference) => !offered.has(serializeObjRef(reference.ref)));
|
|
30
32
|
return [...ambientReferences, ...workspaceReferences].filter((reference) => !selectedReferences.some((selectedReference) => isSameObject(selectedReference, reference)));
|
|
31
|
-
}, [active, ambient, dashboards
|
|
33
|
+
}, [active, ambient, dashboards, visualizations, emptyReferenceLabel, search]);
|
|
34
|
+
const setSearch = useCallback((value) => {
|
|
35
|
+
if (value === search) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
dispatch(setContextObjectsSearchAction({ search: value }));
|
|
39
|
+
}, [dispatch, search]);
|
|
32
40
|
const nextPageKind = dashboards.hasNextPage
|
|
33
41
|
? "dashboard"
|
|
34
42
|
: visualizations.hasNextPage
|
|
@@ -42,11 +50,21 @@ export function useContextItems(ambient, active) {
|
|
|
42
50
|
}, [dispatch, nextPageKind]);
|
|
43
51
|
return {
|
|
44
52
|
items,
|
|
53
|
+
search,
|
|
54
|
+
setSearch,
|
|
45
55
|
isLoading: dashboards.isLoading || visualizations.isLoading,
|
|
46
56
|
hasNextPage: nextPageKind !== undefined,
|
|
47
57
|
loadNextPage,
|
|
48
58
|
};
|
|
49
59
|
}
|
|
60
|
+
function titleMatcher(search) {
|
|
61
|
+
const normalized = search.trim().toLowerCase();
|
|
62
|
+
return normalized ? (reference) => reference.title.toLowerCase().includes(normalized) : () => true;
|
|
63
|
+
}
|
|
64
|
+
function searchable(list, type, emptyReferenceLabel, matchesSearch) {
|
|
65
|
+
const references = toContextObjects(list.items, type, emptyReferenceLabel);
|
|
66
|
+
return list.isExternal ? references.filter(matchesSearch) : references;
|
|
67
|
+
}
|
|
50
68
|
function toContextObjects(items, type, emptyReferenceLabel) {
|
|
51
69
|
return items.map((item) => ({
|
|
52
70
|
id: item.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInputAutofocus.d.ts","sourceRoot":"","sources":["../../../src/components/hooks/useInputAutofocus.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"useInputAutofocus.d.ts","sourceRoot":"","sources":["../../../src/components/hooks/useInputAutofocus.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAOnD,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,UAAU,GAAG,IAAI,EAC5B,SAAS,EAAE,OAAO,EAClB,IAAI,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,2EA2C5B"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
// (C) 2026 GoodData Corporation
|
|
2
2
|
import { createRef, useEffect, useMemo, useRef } from "react";
|
|
3
|
+
import { useSelector } from "react-redux";
|
|
3
4
|
import { useUiAutofocusConnectors } from "@gooddata/sdk-ui-kit";
|
|
5
|
+
import { conversationSelector } from "../../store/messages/messagesSelectors.js";
|
|
4
6
|
export function useInputAutofocus(editorApi, autofocus, opts) {
|
|
5
7
|
// Force focus when autofocus is enables on the first mount, right after the initial state is loaded
|
|
6
8
|
const forceFocusOnce = useRef(autofocus);
|
|
9
|
+
const conversationLocalId = useSelector(conversationSelector)?.localId;
|
|
10
|
+
const focusedConversationLocalId = useRef(conversationLocalId);
|
|
7
11
|
const initialFocus = useMemo(() => {
|
|
8
12
|
const ref = createRef();
|
|
9
13
|
ref.current = editorApi?.contentDOM;
|
|
@@ -11,14 +15,21 @@ export function useInputAutofocus(editorApi, autofocus, opts) {
|
|
|
11
15
|
}, [editorApi]);
|
|
12
16
|
const ref = useUiAutofocusConnectors({
|
|
13
17
|
initialFocus,
|
|
14
|
-
active: autofocus &&
|
|
15
|
-
|
|
18
|
+
active: autofocus &&
|
|
19
|
+
!opts.isBusy &&
|
|
20
|
+
(forceFocusOnce.current ||
|
|
21
|
+
document.activeElement === document.body ||
|
|
22
|
+
focusedConversationLocalId.current !== conversationLocalId),
|
|
23
|
+
refocusKey: `${opts.isBusy}-${conversationLocalId ?? ""}`,
|
|
16
24
|
});
|
|
17
25
|
useEffect(() => {
|
|
18
26
|
if (document.activeElement === editorApi?.contentDOM) {
|
|
19
27
|
forceFocusOnce.current = false;
|
|
20
28
|
}
|
|
21
29
|
}, [editorApi]);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
focusedConversationLocalId.current = conversationLocalId;
|
|
32
|
+
}, [conversationLocalId]);
|
|
22
33
|
useEffect(() => () => {
|
|
23
34
|
// When unmount occurred, reset the autofocus
|
|
24
35
|
forceFocusOnce.current = true;
|
|
@@ -10,6 +10,7 @@ export interface IIntelligenceTimelineProps {
|
|
|
10
10
|
* The single timeline track shared by the list view and every category's detail view: one tile
|
|
11
11
|
* per interaction step, with a hover tooltip listing that step's activities and its own
|
|
12
12
|
* duration/tokens. Never navigable — highlighting is driven entirely by `highlightedStepIndexes`.
|
|
13
|
+
* Self-gated on the `enableGenAiInteractionIntelligence_timeline` sub-flag.
|
|
13
14
|
*/
|
|
14
|
-
export declare function IntelligenceTimeline({ steps, totalDurationMs, categories, highlightedStepIndexes }: IIntelligenceTimelineProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export declare function IntelligenceTimeline({ steps, totalDurationMs, categories, highlightedStepIndexes }: IIntelligenceTimelineProps): import("react/jsx-runtime").JSX.Element | null;
|
|
15
16
|
//# sourceMappingURL=IntelligenceTimeline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IntelligenceTimeline.d.ts","sourceRoot":"","sources":["../../../../src/components/intelligence/panel/IntelligenceTimeline.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"IntelligenceTimeline.d.ts","sourceRoot":"","sources":["../../../../src/components/intelligence/panel/IntelligenceTimeline.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAMnF,MAAM,WAAW,0BAA0B;IACvC,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,8FAA4F;IAC5F,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,EACjC,KAAK,EACL,eAAe,EACf,UAAU,EACV,sBAAsB,EACzB,EAAE,0BAA0B,kDAmB5B"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
// (C) 2026 GoodData Corporation
|
|
3
3
|
import { useMemo } from "react";
|
|
4
|
+
import { useSelector } from "react-redux";
|
|
5
|
+
import { interactionIntelligenceTimelineEnabledSelector } from "../../../store/chatWindow/chatWindowSelectors.js";
|
|
4
6
|
import { computeSegments } from "../data/timeline.js";
|
|
5
7
|
import { e } from "../intelligenceBem.js";
|
|
6
8
|
import { IntelligenceStepTooltip } from "./IntelligenceStepTooltip.js";
|
|
@@ -9,8 +11,13 @@ import { TimelineBar } from "./TimelineBar.js";
|
|
|
9
11
|
* The single timeline track shared by the list view and every category's detail view: one tile
|
|
10
12
|
* per interaction step, with a hover tooltip listing that step's activities and its own
|
|
11
13
|
* duration/tokens. Never navigable — highlighting is driven entirely by `highlightedStepIndexes`.
|
|
14
|
+
* Self-gated on the `enableGenAiInteractionIntelligence_timeline` sub-flag.
|
|
12
15
|
*/
|
|
13
16
|
export function IntelligenceTimeline({ steps, totalDurationMs, categories, highlightedStepIndexes, }) {
|
|
17
|
+
const timelineEnabled = useSelector(interactionIntelligenceTimelineEnabledSelector);
|
|
14
18
|
const segments = useMemo(() => computeSegments(steps, totalDurationMs), [steps, totalDurationMs]);
|
|
19
|
+
if (!timelineEnabled) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
15
22
|
return (_jsx("div", { className: e("timeline-wrapper"), children: _jsx(TimelineBar, { segments: segments, highlightedStepIndexes: highlightedStepIndexes, renderTooltip: (segment) => (_jsx(IntelligenceStepTooltip, { step: steps[segment.stepIndex], categories: categories })) }) }));
|
|
16
23
|
}
|
|
@@ -15,6 +15,7 @@ export declare const reasoningEffortEnabledSelector: (state: RootState) => boole
|
|
|
15
15
|
export declare const agentSwitchingActiveSelector: (state: RootState) => boolean;
|
|
16
16
|
export declare const allowInteractionIntelligenceSelector: (state: RootState) => boolean;
|
|
17
17
|
export declare const interactionIntelligenceEnabledSelector: (state: RootState) => boolean;
|
|
18
|
+
export declare const interactionIntelligenceTimelineEnabledSelector: (state: RootState) => boolean;
|
|
18
19
|
export declare const objectTypesSelector: (state: RootState) => GenAIObjectType[] | undefined;
|
|
19
20
|
export declare const allowedRelationshipTypesSelector: (state: RootState) => IAllowedRelationshipType[] | undefined;
|
|
20
21
|
export declare const tagsSelector: (state: RootState) => {
|
|
@@ -23,6 +24,7 @@ export declare const tagsSelector: (state: RootState) => {
|
|
|
23
24
|
};
|
|
24
25
|
export declare const catalogItemsSelector: (state: RootState) => CatalogItem[];
|
|
25
26
|
export declare const contextObjectsSelector: (state: RootState) => ContextObjectsState;
|
|
27
|
+
export declare const contextObjectsSearchSelector: (state: RootState) => string;
|
|
26
28
|
export declare const keyDriverAnalysisSelector: (state: RootState) => IKdaDefinition | undefined;
|
|
27
29
|
export declare const keyDriverAnalysisMinimizedSelector: (state: RootState) => boolean | undefined;
|
|
28
30
|
export declare const userContextSelector: (state: RootState) => IGenAIUserContext | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatWindowSelectors.d.ts","sourceRoot":"","sources":["../../../src/store/chatWindow/chatWindowSelectors.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,iBAAiB,EAEzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,eAAO,MAAM,cAAc,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAGlD,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAGxD,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAGrD,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,aAAa,GAAG,SAGxE,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,sBAAsB,GAAG,SAG7E,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAGrD,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAGjE,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAG/D,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAGlE,CAAC;AAKF,eAAO,MAAM,4BAA4B,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAIhE,CAAC;AAEF,eAAO,MAAM,oCAAoC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAGxE,CAAC;AAKF,eAAO,MAAM,sCAAsC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAK1E,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,eAAe,EAAE,GAAG,SAG3E,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,wBAAwB,EAAE,GAAG,SACZ,CAAC;AAEvF,eAAO,MAAM,YAAY,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK;IAC7C,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAClC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CAMpC,CAAC;AAEH,eAAO,MAAM,oBAAoB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,WAAW,EAKnE,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,mBAG1D,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,cAAc,GAAG,SAG9E,CAAC;AAEF,eAAO,MAAM,kCAAkC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,GAAG,SAGhF,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,iBAAiB,GAAG,SAG3E,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,iBAAiB,GAAG,SAG9E,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAe5D,CAAC"}
|
|
1
|
+
{"version":3,"file":"chatWindowSelectors.d.ts","sourceRoot":"","sources":["../../../src/store/chatWindow/chatWindowSelectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,8 @@ export const allowInteractionIntelligenceSelector = createSelector(chatWindowSli
|
|
|
21
21
|
// Requires both the plug-in instance to allow it (agent builder passes `allowInteractionIntelligence`)
|
|
22
22
|
// and the workspace-level feature flag to be on.
|
|
23
23
|
export const interactionIntelligenceEnabledSelector = createSelector(allowInteractionIntelligenceSelector, settingsSelector, (allowInteractionIntelligence, settings) => allowInteractionIntelligence && settings?.["enableGenAiInteractionIntelligence"] === true);
|
|
24
|
+
// Whether the timeline bar is shown inside the (already gated) Interaction Intelligence panel.
|
|
25
|
+
export const interactionIntelligenceTimelineEnabledSelector = createSelector(settingsSelector, (settings) => settings?.["enableGenAiInteractionIntelligence_timeline"] === true);
|
|
24
26
|
export const objectTypesSelector = createSelector(chatWindowSliceSelector, (state) => state.objectTypes);
|
|
25
27
|
export const allowedRelationshipTypesSelector = createSelector(chatWindowSliceSelector, (state) => state.allowedRelationshipTypes);
|
|
26
28
|
export const tagsSelector = createSelector(chatWindowSliceSelector, (state) => {
|
|
@@ -33,6 +35,7 @@ export const catalogItemsSelector = createSelector(chatWindowSliceSelector, (sta
|
|
|
33
35
|
return state.catalogItems ?? [];
|
|
34
36
|
});
|
|
35
37
|
export const contextObjectsSelector = createSelector(chatWindowSliceSelector, (state) => state.contextObjects);
|
|
38
|
+
export const contextObjectsSearchSelector = createSelector(chatWindowSliceSelector, (state) => state.contextObjectsSearch);
|
|
36
39
|
export const keyDriverAnalysisSelector = createSelector(chatWindowSliceSelector, (state) => state.keyDriverAnalysis);
|
|
37
40
|
export const keyDriverAnalysisMinimizedSelector = createSelector(chatWindowSliceSelector, (state) => state.keyDriverAnalysisMinimized);
|
|
38
41
|
export const userContextSelector = createSelector(chatWindowSliceSelector, (state) => state.context.active);
|
|
@@ -44,6 +44,10 @@ type ChatWindowSliceState = {
|
|
|
44
44
|
* Dashboards and visualizations offered by the context chooser, on top of the ambient ones.
|
|
45
45
|
*/
|
|
46
46
|
contextObjects: ContextObjectsState;
|
|
47
|
+
/**
|
|
48
|
+
* Title the context chooser lists are filtered by. Empty means no filter.
|
|
49
|
+
*/
|
|
50
|
+
contextObjectsSearch: string;
|
|
47
51
|
/**
|
|
48
52
|
* Only objects with these tags will be included
|
|
49
53
|
*/
|
|
@@ -101,7 +105,9 @@ export declare const setOpenAction: import("@reduxjs/toolkit").ActionCreatorWith
|
|
|
101
105
|
}, "chatWindow/loadContextObjectsNextPageAction">, setContextObjectsAction: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
102
106
|
kind: ContextObjectKind;
|
|
103
107
|
items: IGenAIContextListItem[];
|
|
104
|
-
}, "chatWindow/setContextObjectsAction">,
|
|
108
|
+
}, "chatWindow/setContextObjectsAction">, setContextObjectsSearchAction: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
109
|
+
search: string;
|
|
110
|
+
}, "chatWindow/setContextObjectsSearchAction">, contextObjectsLoadingAction: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
105
111
|
kind: ContextObjectKind;
|
|
106
112
|
}, "chatWindow/contextObjectsLoadingAction">, contextObjectsPageLoadedAction: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
107
113
|
kind: ContextObjectKind;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatWindowSlice.d.ts","sourceRoot":"","sources":["../../../src/store/chatWindow/chatWindowSlice.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,OAAO,EAAe,MAAM,kBAAkB,CAAC;AAEjF,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EAEhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAKjE,OAAO,EACH,KAAK,iBAAiB,EAEtB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACpB,MAAM,gBAAgB,CAAC;AAGxB,KAAK,oBAAoB,GAAG;IACxB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,YAAY,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC;;OAEG;IACH,iBAAiB,CAAC,EAAE,cAAc,CAAC;IACnC;;OAEG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC;;OAEG;IACH,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B;;OAEG;IACH,cAAc,EAAE,mBAAmB,CAAC;IACpC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;OAEG;IACH,wBAAwB,CAAC,EAAE,wBAAwB,EAAE,CAAC;IACtD;;OAEG;IACH,OAAO,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;CAC1C,CAAC;AAEF,eAAO,MAAM,mBAAmB,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"chatWindowSlice.d.ts","sourceRoot":"","sources":["../../../src/store/chatWindow/chatWindowSlice.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,OAAO,EAAe,MAAM,kBAAkB,CAAC;AAEjF,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EAEhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAKjE,OAAO,EACH,KAAK,iBAAiB,EAEtB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACpB,MAAM,gBAAgB,CAAC;AAGxB,KAAK,oBAAoB,GAAG;IACxB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,YAAY,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC;;OAEG;IACH,iBAAiB,CAAC,EAAE,cAAc,CAAC;IACnC;;OAEG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC;;OAEG;IACH,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B;;OAEG;IACH,cAAc,EAAE,mBAAmB,CAAC;IACpC;;OAEG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;OAEG;IACH,wBAAwB,CAAC,EAAE,wBAAwB,EAAE,CAAC;IACtD;;OAEG;IACH,OAAO,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;CAC1C,CAAC;AAEF,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAuChD,eAAO,MAAM,yBAAyB;;;0BAYpC,CAAC;AA+MH,eAAO,MAAM,sBAAsB,EAAE,OAAO,CAAC,oBAAoB,CAA2B,CAAC;AAC7F,eAAO,MACH,aAAa;;gCACb,gBAAgB;;mCAChB,qBAAqB;;wCACrB,iBAAiB;;oCACjB,qBAAqB;;wCACrB,0BAA0B;;6CAC1B,mCAAmC;;sDACnC,oBAAoB;;uCACpB,aAAa;;;gCACb,sBAAsB,+HACtB,wBAAwB,iGACxB,gCAAgC;;mDAChC,uBAAuB;;;0CACvB,6BAA6B;;gDAC7B,2BAA2B;;8CAC3B,8BAA8B;;;;iDAC9B,8BAA8B;;iDAC9B,iCAAiC;;oDACjC,0BAA0B;;;;;;;;6CAC1B,yBAAyB;;4CACzB,4BAA4B;;+CAC5B,kBAAkB;;;AAClB;;;GAGG;AACH,mBAAmB;;;AACnB;;GAEG;AACH,2BAA2B;;;AAC3B;;GAEG;AACH,oBAAoB;;;qCACG,CAAC"}
|
|
@@ -6,12 +6,13 @@ import { mergeContexts } from "../../context/build.js";
|
|
|
6
6
|
import { removeContextReference, removeUserContextReferences } from "../../context/removeContextReference.js";
|
|
7
7
|
import { clearThreadAction, startNewConversationAction } from "../messages/messagesSlice.js";
|
|
8
8
|
export const chatWindowSliceName = "chatWindow";
|
|
9
|
-
function emptyContextObjectList() {
|
|
9
|
+
function emptyContextObjectList(isExternal = false) {
|
|
10
10
|
return {
|
|
11
11
|
items: [],
|
|
12
12
|
loadedPages: 0,
|
|
13
13
|
hasNextPage: true,
|
|
14
14
|
isLoading: false,
|
|
15
|
+
isExternal,
|
|
15
16
|
};
|
|
16
17
|
}
|
|
17
18
|
function emptyContextObjects() {
|
|
@@ -31,6 +32,7 @@ const initialState = {
|
|
|
31
32
|
excludeTags: undefined,
|
|
32
33
|
allowedRelationshipTypes: undefined,
|
|
33
34
|
contextObjects: emptyContextObjects(),
|
|
35
|
+
contextObjectsSearch: "",
|
|
34
36
|
context: {
|
|
35
37
|
ambient: undefined,
|
|
36
38
|
active: undefined,
|
|
@@ -41,6 +43,7 @@ const initialState = {
|
|
|
41
43
|
export const getInitialChatWindowState = ({ isPreview, allowInteractionIntelligence, } = {}) => ({
|
|
42
44
|
...initialState,
|
|
43
45
|
contextObjects: emptyContextObjects(),
|
|
46
|
+
contextObjectsSearch: "",
|
|
44
47
|
isPreview,
|
|
45
48
|
allowInteractionIntelligence,
|
|
46
49
|
});
|
|
@@ -90,8 +93,17 @@ const chatWindowSlice = createSlice({
|
|
|
90
93
|
loadedPages: 1,
|
|
91
94
|
hasNextPage: false,
|
|
92
95
|
isLoading: false,
|
|
96
|
+
isExternal: true,
|
|
93
97
|
};
|
|
94
98
|
},
|
|
99
|
+
setContextObjectsSearchAction: (state, { payload: { search } }) => {
|
|
100
|
+
state.contextObjectsSearch = search;
|
|
101
|
+
["dashboard", "visualization"].forEach((kind) => {
|
|
102
|
+
if (!state.contextObjects[kind].isExternal) {
|
|
103
|
+
state.contextObjects[kind] = emptyContextObjectList();
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
},
|
|
95
107
|
contextObjectsLoadingAction: (state, { payload: { kind } }) => {
|
|
96
108
|
state.contextObjects[kind].isLoading = true;
|
|
97
109
|
},
|
|
@@ -156,7 +168,7 @@ const chatWindowSlice = createSlice({
|
|
|
156
168
|
},
|
|
157
169
|
});
|
|
158
170
|
export const chatWindowSliceReducer = chatWindowSlice.reducer;
|
|
159
|
-
export const { setOpenAction, setHistoryAction, setColorPaletteAction, setSettingsAction, copyToClipboardAction, setKeyDriverAnalysisAction, setKeyDriverAnalysisMinimizedAction, setObjectTypesAction, setTagsAction, setCatalogItemsActions, initContextObjectsAction, loadContextObjectsNextPageAction, setContextObjectsAction, contextObjectsLoadingAction, contextObjectsPageLoadedAction, contextObjectsLoadFailedAction, setAllowedRelationshipTypesAction, onDefinitionReceivedAction, addContextReferenceAction, removeContextReferenceAction, setIsPreviewAction,
|
|
171
|
+
export const { setOpenAction, setHistoryAction, setColorPaletteAction, setSettingsAction, copyToClipboardAction, setKeyDriverAnalysisAction, setKeyDriverAnalysisMinimizedAction, setObjectTypesAction, setTagsAction, setCatalogItemsActions, initContextObjectsAction, loadContextObjectsNextPageAction, setContextObjectsAction, setContextObjectsSearchAction, contextObjectsLoadingAction, contextObjectsPageLoadedAction, contextObjectsLoadFailedAction, setAllowedRelationshipTypesAction, onDefinitionReceivedAction, addContextReferenceAction, removeContextReferenceAction, setIsPreviewAction,
|
|
160
172
|
/**
|
|
161
173
|
* Switches the assistant between the docked and the fullscreen layout.
|
|
162
174
|
* @public
|
package/esm/store/options.d.ts
CHANGED
|
@@ -16,10 +16,12 @@ export declare class OptionsDispatcher {
|
|
|
16
16
|
private visualizations;
|
|
17
17
|
private mode;
|
|
18
18
|
private onLinkClick;
|
|
19
|
+
private onLinkClickHandlers;
|
|
19
20
|
private allowNativeLinks;
|
|
20
21
|
setColorPalette(colorPalette: IColorPalette | undefined): void;
|
|
21
22
|
getColorPalette(): IColorPalette | undefined;
|
|
22
23
|
setOnLinkClick(onLinkClick?: (linkClickEvent: LinkHandlerEvent) => string | undefined, allowNativeLinks?: boolean): void;
|
|
24
|
+
registerLinkHandler(handler: (linkClickEvent: LinkHandlerEvent) => string | undefined): () => void;
|
|
23
25
|
getOnLinkClick(): {
|
|
24
26
|
onLinkClick?: (linkClickEvent: LinkHandlerEvent) => string | undefined;
|
|
25
27
|
allowNativeLinks?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/store/options.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAE3F;;;GAGG;AACH,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,QAAQ,CAAiD;IACjE,OAAO,CAAC,WAAW,CAA4C;IAC/D,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,UAAU,CAA6C;IAC/D,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,IAAI,CAA6C;IACzD,OAAO,CAAC,WAAW,CAAqF;IACxG,OAAO,CAAC,gBAAgB,CAAkC;IAEnD,eAAe,CAAC,YAAY,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAEpE;IAEM,eAAe,IAAI,aAAa,GAAG,SAAS,CAElD;IAEM,cAAc,CACjB,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,EACtE,gBAAgB,CAAC,EAAE,OAAO,GAC3B,IAAI,CAGN;IAEM,cAAc,IAAI;QACrB,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,CAAC;QACvE,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC9B,
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/store/options.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAE3F;;;GAGG;AACH,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,QAAQ,CAAiD;IACjE,OAAO,CAAC,WAAW,CAA4C;IAC/D,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,UAAU,CAA6C;IAC/D,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,IAAI,CAA6C;IACzD,OAAO,CAAC,WAAW,CAAqF;IACxG,OAAO,CAAC,mBAAmB,CAAuE;IAClG,OAAO,CAAC,gBAAgB,CAAkC;IAEnD,eAAe,CAAC,YAAY,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAEpE;IAEM,eAAe,IAAI,aAAa,GAAG,SAAS,CAElD;IAEM,cAAc,CACjB,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,EACtE,gBAAgB,CAAC,EAAE,OAAO,GAC3B,IAAI,CAGN;IAEM,mBAAmB,CACtB,OAAO,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,GAClE,MAAM,IAAI,CAGZ;IAEM,cAAc,IAAI;QACrB,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,CAAC;QACvE,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAiBA;IAEM,WAAW,CAAC,QAAQ,EAAE,sBAAsB,GAAG,SAAS,GAAG,IAAI,CAErE;IAEM,WAAW,IAAI,sBAAsB,GAAG,SAAS,CAEvD;IAEM,cAAc,CAAC,WAAW,EAAE,eAAe,EAAE,GAAG,SAAS,GAAG,IAAI,CAEtE;IAEM,cAAc,IAAI,eAAe,EAAE,GAAG,SAAS,CAErD;IAEM,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,CAGzF;IAEM,OAAO,IAAI;QAAE,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;KAAE,CAKzF;IAEM,eAAe,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,SAAS,GAAG,IAAI,CAEpE;IAEM,eAAe,IAAI,WAAW,EAAE,GAAG,SAAS,CAElD;IAEM,aAAa,CAAC,UAAU,EAAE,gBAAgB,EAAE,GAAG,SAAS,GAAG,IAAI,CAErE;IAEM,aAAa,IAAI,gBAAgB,EAAE,GAAG,SAAS,CAErD;IAEM,iBAAiB,CAAC,cAAc,EAAE,QAAQ,EAAE,GAAG,SAAS,GAAG,IAAI,CAErE;IAEM,iBAAiB,IAAI,QAAQ,EAAE,GAAG,SAAS,CAEjD;IAEM,OAAO,CAAC,IAAI,EAAE,kBAAkB,GAAG,SAAS,GAAG,IAAI,CAEzD;IAEM,OAAO,IAAI,kBAAkB,GAAG,SAAS,CAE/C;CACJ"}
|
package/esm/store/options.js
CHANGED
|
@@ -14,6 +14,7 @@ export class OptionsDispatcher {
|
|
|
14
14
|
visualizations = undefined;
|
|
15
15
|
mode = undefined;
|
|
16
16
|
onLinkClick = undefined;
|
|
17
|
+
onLinkClickHandlers = new Set();
|
|
17
18
|
allowNativeLinks = undefined;
|
|
18
19
|
setColorPalette(colorPalette) {
|
|
19
20
|
this.colorPalette = colorPalette;
|
|
@@ -25,9 +26,23 @@ export class OptionsDispatcher {
|
|
|
25
26
|
this.onLinkClick = onLinkClick;
|
|
26
27
|
this.allowNativeLinks = allowNativeLinks;
|
|
27
28
|
}
|
|
29
|
+
registerLinkHandler(handler) {
|
|
30
|
+
this.onLinkClickHandlers.add(handler);
|
|
31
|
+
return () => this.onLinkClickHandlers.delete(handler);
|
|
32
|
+
}
|
|
28
33
|
getOnLinkClick() {
|
|
34
|
+
const onLinkClick = this.onLinkClick || this.onLinkClickHandlers.size > 0
|
|
35
|
+
? (event) => {
|
|
36
|
+
const resultCurrent = this.onLinkClick?.(event);
|
|
37
|
+
let resultParents;
|
|
38
|
+
this.onLinkClickHandlers.forEach((handler) => {
|
|
39
|
+
resultParents = handler(event) ?? resultParents;
|
|
40
|
+
});
|
|
41
|
+
return resultParents ?? resultCurrent;
|
|
42
|
+
}
|
|
43
|
+
: undefined;
|
|
29
44
|
return {
|
|
30
|
-
onLinkClick
|
|
45
|
+
onLinkClick,
|
|
31
46
|
allowNativeLinks: this.allowNativeLinks,
|
|
32
47
|
};
|
|
33
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/store/sideEffects/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/store/sideEffects/index.ts"],"names":[],"mappings":"AAiDA;;;GAGG;AACH,wBAAiB,QAAQ,4HA4BxB"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// (C) 2024-2026 GoodData Corporation
|
|
2
2
|
import { call, fork, takeEvery, takeLatest, takeLeading } from "redux-saga/effects";
|
|
3
|
-
import { initContextObjectsAction, loadContextObjectsNextPageAction, setOpenAction, } from "../chatWindow/chatWindowSlice.js";
|
|
3
|
+
import { initContextObjectsAction, loadContextObjectsNextPageAction, setContextObjectsSearchAction, setOpenAction, } from "../chatWindow/chatWindowSlice.js";
|
|
4
4
|
import { clearThreadAction, deleteConversationAction, evaluateMessageUpdateAction, loadThreadAction, newMessageAction, pinConversationAction, renameConversationAction, saveVisualisationRenderStatusAction, saveVisualizationAction, saveVisualizationSuccessAction, setUserFeedback, setVerboseAction, } from "../messages/messagesSlice.js";
|
|
5
5
|
import { loadAgents } from "./loadAgents.js";
|
|
6
6
|
import { loadCatalogItems } from "./loadCatalogItems.js";
|
|
7
7
|
import { loadColorPalette } from "./loadColorPalette.js";
|
|
8
|
-
import { initContextObjects, loadContextObjectsNextPage } from "./loadContextObjects.js";
|
|
8
|
+
import { initContextObjects, loadContextObjectsNextPage, reloadContextObjects, } from "./loadContextObjects.js";
|
|
9
9
|
import { loadSettings } from "./loadSettings.js";
|
|
10
10
|
import { onChatOpenSync } from "./onChatOpenSync.js";
|
|
11
11
|
import { onConversationDelete } from "./onConversationDelete.js";
|
|
@@ -45,6 +45,7 @@ export function* rootSaga() {
|
|
|
45
45
|
//context chooser
|
|
46
46
|
yield takeLeading(initContextObjectsAction.type, initContextObjects);
|
|
47
47
|
yield takeEvery(loadContextObjectsNextPageAction.type, loadContextObjectsNextPage);
|
|
48
|
+
yield takeLatest(setContextObjectsSearchAction.type, reloadContextObjects);
|
|
48
49
|
//others
|
|
49
50
|
yield takeEvery(setVerboseAction.type, onVerboseStore);
|
|
50
51
|
yield fork(onEvent);
|
|
@@ -6,6 +6,13 @@ import { type loadContextObjectsNextPageAction } from "../chatWindow/chatWindowS
|
|
|
6
6
|
* @internal
|
|
7
7
|
*/
|
|
8
8
|
export declare function initContextObjects(): Generator<import("redux-saga/effects").CallEffect<void>, void, unknown>;
|
|
9
|
+
/**
|
|
10
|
+
* Reload both lists after the searched title changed - a match among the visualizations has to be
|
|
11
|
+
* part of the answer, not something the reader has to scroll the dashboards out of the way to see.
|
|
12
|
+
* The visualizations wait when the dashboards have more pages, which would land above them.
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export declare function reloadContextObjects(): Generator<import("redux-saga/effects").CallEffect<void> | import("redux-saga/effects").SelectEffect, void, ContextObjectsState>;
|
|
9
16
|
/**
|
|
10
17
|
* Load the next page of one of the object lists offered by the context chooser. Each kind is
|
|
11
18
|
* paged on its own, so a load in flight for one kind does not block the other.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadContextObjects.d.ts","sourceRoot":"","sources":["../../../src/store/sideEffects/loadContextObjects.ts"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,mBAAmB,EAA8B,MAAM,gBAAgB,CAAC;AAG9G,OAAO,EAIH,KAAK,gCAAgC,EAExC,MAAM,kCAAkC,CAAC;AAU1C;;;;GAIG;AACH,wBAAiB,kBAAkB,4EAElC;AAED;;;;GAIG;AACH,wBAAiB,0BAA0B,CAAC,EACxC,OAAO,EAAE,EAAE,IAAI,EAAE,EACpB,EAAE,UAAU,CAAC,OAAO,gCAAgC,CAAC,mIASrD"}
|
|
1
|
+
{"version":3,"file":"loadContextObjects.d.ts","sourceRoot":"","sources":["../../../src/store/sideEffects/loadContextObjects.ts"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,mBAAmB,EAA8B,MAAM,gBAAgB,CAAC;AAG9G,OAAO,EAIH,KAAK,gCAAgC,EAExC,MAAM,kCAAkC,CAAC;AAU1C;;;;GAIG;AACH,wBAAiB,kBAAkB,4EAElC;AAED;;;;;GAKG;AACH,wBAAiB,oBAAoB,oIAQpC;AAED;;;;GAIG;AACH,wBAAiB,0BAA0B,CAAC,EACxC,OAAO,EAAE,EAAE,IAAI,EAAE,EACpB,EAAE,UAAU,CAAC,OAAO,gCAAgC,CAAC,mIASrD"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { call, cancelled, getContext, put, select } from "redux-saga/effects";
|
|
3
3
|
import { insightRef, insightTitle } from "@gooddata/sdk-model";
|
|
4
4
|
import { toContextListItem } from "../../utils.js";
|
|
5
|
-
import { contextObjectsSelector } from "../chatWindow/chatWindowSelectors.js";
|
|
5
|
+
import { contextObjectsSearchSelector, contextObjectsSelector } from "../chatWindow/chatWindowSelectors.js";
|
|
6
6
|
import { contextObjectsLoadFailedAction, contextObjectsLoadingAction, contextObjectsPageLoadedAction, setContextObjectsAction, } from "../chatWindow/chatWindowSlice.js";
|
|
7
7
|
const PAGE_SIZE = 100;
|
|
8
8
|
/**
|
|
@@ -13,6 +13,19 @@ const PAGE_SIZE = 100;
|
|
|
13
13
|
export function* initContextObjects() {
|
|
14
14
|
yield call(initContextObjectList, "dashboard");
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Reload both lists after the searched title changed - a match among the visualizations has to be
|
|
18
|
+
* part of the answer, not something the reader has to scroll the dashboards out of the way to see.
|
|
19
|
+
* The visualizations wait when the dashboards have more pages, which would land above them.
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
22
|
+
export function* reloadContextObjects() {
|
|
23
|
+
yield call(loadContextObjectsPage, "dashboard", 0);
|
|
24
|
+
const state = yield select(contextObjectsSelector);
|
|
25
|
+
if (!state.dashboard.hasNextPage) {
|
|
26
|
+
yield call(loadContextObjectsPage, "visualization", 0);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
16
29
|
/**
|
|
17
30
|
* Load the next page of one of the object lists offered by the context chooser. Each kind is
|
|
18
31
|
* paged on its own, so a load in flight for one kind does not block the other.
|
|
@@ -42,7 +55,8 @@ function* loadContextObjectsPage(kind, page) {
|
|
|
42
55
|
}
|
|
43
56
|
yield put(contextObjectsLoadingAction({ kind }));
|
|
44
57
|
try {
|
|
45
|
-
const
|
|
58
|
+
const search = yield select(contextObjectsSearchSelector);
|
|
59
|
+
const loaded = yield call(kind === "dashboard" ? queryDashboardsPage : queryVisualizationsPage, page, search);
|
|
46
60
|
yield put(contextObjectsPageLoadedAction({ kind, ...loaded }));
|
|
47
61
|
}
|
|
48
62
|
catch (e) {
|
|
@@ -65,16 +79,16 @@ function* getExternalItems(kind) {
|
|
|
65
79
|
.getVisualizations()
|
|
66
80
|
?.map((insight) => toContextListItem(insightRef(insight), insightTitle(insight)));
|
|
67
81
|
}
|
|
68
|
-
function* queryDashboardsPage(page) {
|
|
82
|
+
function* queryDashboardsPage(page, search) {
|
|
69
83
|
const backend = yield getContext("backend");
|
|
70
84
|
const workspace = yield getContext("workspace");
|
|
71
|
-
const query = backend
|
|
85
|
+
const query = withTitleFilter(backend
|
|
72
86
|
.workspace(workspace)
|
|
73
87
|
.dashboards()
|
|
74
88
|
.getDashboardsQuery()
|
|
75
89
|
.withPage(page)
|
|
76
90
|
.withSize(PAGE_SIZE)
|
|
77
|
-
.withSorting(["title,asc"]);
|
|
91
|
+
.withSorting(["title,asc"]), search);
|
|
78
92
|
const queryCall = query.query.bind(query);
|
|
79
93
|
const result = yield call(queryCall);
|
|
80
94
|
return {
|
|
@@ -82,16 +96,16 @@ function* queryDashboardsPage(page) {
|
|
|
82
96
|
hasNextPage: hasNextPage(result),
|
|
83
97
|
};
|
|
84
98
|
}
|
|
85
|
-
function* queryVisualizationsPage(page) {
|
|
99
|
+
function* queryVisualizationsPage(page, search) {
|
|
86
100
|
const backend = yield getContext("backend");
|
|
87
101
|
const workspace = yield getContext("workspace");
|
|
88
|
-
const query = backend
|
|
102
|
+
const query = withTitleFilter(backend
|
|
89
103
|
.workspace(workspace)
|
|
90
104
|
.insights()
|
|
91
105
|
.getInsightsQuery()
|
|
92
106
|
.withPage(page)
|
|
93
107
|
.withSize(PAGE_SIZE)
|
|
94
|
-
.withSorting(["title,asc"]);
|
|
108
|
+
.withSorting(["title,asc"]), search);
|
|
95
109
|
const queryCall = query.query.bind(query);
|
|
96
110
|
const result = yield call(queryCall);
|
|
97
111
|
return {
|
|
@@ -102,3 +116,7 @@ function* queryVisualizationsPage(page) {
|
|
|
102
116
|
function hasNextPage(result) {
|
|
103
117
|
return result.offset + result.items.length < result.totalCount;
|
|
104
118
|
}
|
|
119
|
+
function withTitleFilter(query, search) {
|
|
120
|
+
const title = search.trim();
|
|
121
|
+
return title ? query.withFilter({ title }) : query;
|
|
122
|
+
}
|
package/esm/store/store.d.ts
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
|
+
import { type EnhancedStore } from "@reduxjs/toolkit";
|
|
1
2
|
import { type IAnalyticalBackend } from "@gooddata/sdk-backend-spi";
|
|
3
|
+
import { chatWindowSliceName, chatWindowSliceReducer } from "./chatWindow/chatWindowSlice.js";
|
|
2
4
|
import { type EventDispatcher } from "./events.js";
|
|
5
|
+
import { messagesSliceName, messagesSliceReducer } from "./messages/messagesSlice.js";
|
|
3
6
|
import { type OptionsDispatcher } from "./options.js";
|
|
4
|
-
export
|
|
7
|
+
export type GenAiStore = EnhancedStore<{
|
|
8
|
+
[messagesSliceName]: ReturnType<typeof messagesSliceReducer>;
|
|
9
|
+
[chatWindowSliceName]: ReturnType<typeof chatWindowSliceReducer>;
|
|
10
|
+
}> & {
|
|
11
|
+
optionsDispatcher: OptionsDispatcher;
|
|
12
|
+
};
|
|
13
|
+
export declare const getStore: (backend: IAnalyticalBackend, workspace: string, eventDispatcher: EventDispatcher, optionsDispatcher: OptionsDispatcher, isPreview: boolean | undefined, allowInteractionIntelligence: boolean | undefined) => GenAiStore;
|
|
5
14
|
//# sourceMappingURL=store.d.ts.map
|
package/esm/store/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AAItE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EACH,mBAAmB,EACnB,sBAAsB,EAEzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAStD,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC;IACnC,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;IAC7D,CAAC,mBAAmB,CAAC,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;CACpE,CAAC,GAAG;IACD,iBAAiB,EAAE,iBAAiB,CAAC;CACxC,CAAC;AAEF,eAAO,MAAM,QAAQ,2NA4CpB,CAAC"}
|
package/esm/store/store.js
CHANGED
package/esm/types.d.ts
CHANGED
package/esm/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,gCAAgC,EACrC,KAAK,2BAA2B,EAChC,KAAK,qCAAqC,EAC7C,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACH,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,MAAM,EACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,MAAM,MAAM,GACZ,mBAAmB,CAAC,QAAQ,CAAC,GAC7B,WAAW,CACP,qCAAqC,CAAC,eAAe,CAAC,CACzD,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC;AAE7C,MAAM,MAAM,kBAAkB,GAAG;IAC7B;;;;;;;OAOG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IAClD;;;OAGG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,CAAC;IACnE;;;OAGG;IACH,kBAAkB,CAAC,EAAE;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;KACvC,CAAC;IACF;;;;OAIG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;CACrE,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,8BAA8B,GAAG;IACzC,KAAK,EAAE,gCAAgC,EAAE,CAAC;IAC1C,2EAA2E;IAC3E,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,6BAA6B,EAAE,CAAC,CAAC;IACjE;;;OAGG;IACH,eAAe,EAAE,6BAA6B,EAAE,CAAC;IACjD,0GAA0G;IAC1G,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,6BAA6B,GAAG;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,2BAA2B,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACvB;;;;OAIG;IACH,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B;;OAEG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,eAAe,GAAG,QAAQ,CAAC;IACjC,KAAK,EAAE,gBAAgB,GAAG,mBAAmB,CAAC;IAC9C,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,eAAe,CAAC;AAE9D;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gooddata/sdk-ui-gen-ai",
|
|
3
|
-
"version": "11.53.0-alpha.
|
|
3
|
+
"version": "11.53.0-alpha.7",
|
|
4
4
|
"description": "GoodData GenAI SDK",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "GoodData Corporation",
|
|
@@ -57,18 +57,18 @@
|
|
|
57
57
|
"reselect": "5.1.1",
|
|
58
58
|
"tslib": "2.8.1",
|
|
59
59
|
"uuid": "11.1.1",
|
|
60
|
-
"@gooddata/api-client-tiger": "11.53.0-alpha.
|
|
61
|
-
"@gooddata/sdk-backend-spi": "11.53.0-alpha.
|
|
62
|
-
"@gooddata/sdk-ui": "11.53.0-alpha.
|
|
63
|
-
"@gooddata/sdk-
|
|
64
|
-
"@gooddata/sdk-
|
|
65
|
-
"@gooddata/sdk-ui-dashboard": "11.53.0-alpha.
|
|
66
|
-
"@gooddata/sdk-ui-filters": "11.53.0-alpha.
|
|
67
|
-
"@gooddata/sdk-ui-
|
|
68
|
-
"@gooddata/sdk-ui-
|
|
69
|
-
"@gooddata/sdk-ui-semantic-search": "11.53.0-alpha.
|
|
70
|
-
"@gooddata/sdk-ui-theme-provider": "11.53.0-alpha.
|
|
71
|
-
"@gooddata/util": "11.53.0-alpha.
|
|
60
|
+
"@gooddata/api-client-tiger": "11.53.0-alpha.7",
|
|
61
|
+
"@gooddata/sdk-backend-spi": "11.53.0-alpha.7",
|
|
62
|
+
"@gooddata/sdk-ui-charts": "11.53.0-alpha.7",
|
|
63
|
+
"@gooddata/sdk-ui": "11.53.0-alpha.7",
|
|
64
|
+
"@gooddata/sdk-model": "11.53.0-alpha.7",
|
|
65
|
+
"@gooddata/sdk-ui-dashboard": "11.53.0-alpha.7",
|
|
66
|
+
"@gooddata/sdk-ui-filters": "11.53.0-alpha.7",
|
|
67
|
+
"@gooddata/sdk-ui-pivot": "11.53.0-alpha.7",
|
|
68
|
+
"@gooddata/sdk-ui-kit": "11.53.0-alpha.7",
|
|
69
|
+
"@gooddata/sdk-ui-semantic-search": "11.53.0-alpha.7",
|
|
70
|
+
"@gooddata/sdk-ui-theme-provider": "11.53.0-alpha.7",
|
|
71
|
+
"@gooddata/util": "11.53.0-alpha.7"
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
74
|
"@microsoft/api-documenter": "^7.17.0",
|
|
@@ -111,13 +111,13 @@
|
|
|
111
111
|
"typescript": "5.9.3",
|
|
112
112
|
"vitest": "4.1.8",
|
|
113
113
|
"vitest-dom": "0.1.1",
|
|
114
|
-
"@gooddata/eslint-config": "11.53.0-alpha.
|
|
115
|
-
"@gooddata/i18n-toolkit": "11.53.0-alpha.
|
|
116
|
-
"@gooddata/oxlint-config": "11.53.0-alpha.
|
|
117
|
-
"@gooddata/reference-workspace": "11.53.0-alpha.
|
|
118
|
-
"@gooddata/sdk-
|
|
119
|
-
"@gooddata/sdk-
|
|
120
|
-
"@gooddata/stylelint-config": "11.53.0-alpha.
|
|
114
|
+
"@gooddata/eslint-config": "11.53.0-alpha.7",
|
|
115
|
+
"@gooddata/i18n-toolkit": "11.53.0-alpha.7",
|
|
116
|
+
"@gooddata/oxlint-config": "11.53.0-alpha.7",
|
|
117
|
+
"@gooddata/reference-workspace": "11.53.0-alpha.7",
|
|
118
|
+
"@gooddata/sdk-ui-theme-provider": "11.53.0-alpha.7",
|
|
119
|
+
"@gooddata/sdk-backend-mockingbird": "11.53.0-alpha.7",
|
|
120
|
+
"@gooddata/stylelint-config": "11.53.0-alpha.7"
|
|
121
121
|
},
|
|
122
122
|
"peerDependencies": {
|
|
123
123
|
"react": "^18.0.0 || ^19.0.0",
|