@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.
Files changed (39) hide show
  1. package/esm/components/ConfigContext.d.ts.map +1 -1
  2. package/esm/components/ConfigContext.js +8 -15
  3. package/esm/components/GenAIChat.d.ts.map +1 -1
  4. package/esm/components/GenAIChat.js +3 -4
  5. package/esm/components/GenAiChatContextChooser.d.ts.map +1 -1
  6. package/esm/components/GenAiChatContextChooser.js +4 -3
  7. package/esm/components/GenAiChatContextChooserBody.d.ts +3 -1
  8. package/esm/components/GenAiChatContextChooserBody.d.ts.map +1 -1
  9. package/esm/components/GenAiChatContextChooserBody.js +19 -20
  10. package/esm/components/GenAiStore.d.ts.map +1 -1
  11. package/esm/components/GenAiStore.js +18 -2
  12. package/esm/components/hooks/useContextItems.d.ts +2 -0
  13. package/esm/components/hooks/useContextItems.d.ts.map +1 -1
  14. package/esm/components/hooks/useContextItems.js +25 -7
  15. package/esm/components/hooks/useInputAutofocus.d.ts.map +1 -1
  16. package/esm/components/hooks/useInputAutofocus.js +13 -2
  17. package/esm/components/intelligence/panel/IntelligenceTimeline.d.ts +2 -1
  18. package/esm/components/intelligence/panel/IntelligenceTimeline.d.ts.map +1 -1
  19. package/esm/components/intelligence/panel/IntelligenceTimeline.js +7 -0
  20. package/esm/store/chatWindow/chatWindowSelectors.d.ts +2 -0
  21. package/esm/store/chatWindow/chatWindowSelectors.d.ts.map +1 -1
  22. package/esm/store/chatWindow/chatWindowSelectors.js +3 -0
  23. package/esm/store/chatWindow/chatWindowSlice.d.ts +7 -1
  24. package/esm/store/chatWindow/chatWindowSlice.d.ts.map +1 -1
  25. package/esm/store/chatWindow/chatWindowSlice.js +14 -2
  26. package/esm/store/options.d.ts +2 -0
  27. package/esm/store/options.d.ts.map +1 -1
  28. package/esm/store/options.js +16 -1
  29. package/esm/store/sideEffects/index.d.ts.map +1 -1
  30. package/esm/store/sideEffects/index.js +3 -2
  31. package/esm/store/sideEffects/loadContextObjects.d.ts +7 -0
  32. package/esm/store/sideEffects/loadContextObjects.d.ts.map +1 -1
  33. package/esm/store/sideEffects/loadContextObjects.js +26 -8
  34. package/esm/store/store.d.ts +10 -1
  35. package/esm/store/store.d.ts.map +1 -1
  36. package/esm/store/store.js +2 -0
  37. package/esm/types.d.ts +1 -0
  38. package/esm/types.d.ts.map +1 -1
  39. 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,2CA6BlC;AAED,eAAO,MAAM,SAAS,qBAErB,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 ?? parentConfig.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,EAEH,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EAExB,MAAM,oBAAoB,CAAC;AAG5B,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"}
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, useConfig, } from "./ConfigContext.js";
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 { onLinkClick, catalogItems, LandingScreenComponentProvider, DisclaimerComponentProvider, className, } = props;
27
+ const { LandingScreenComponentProvider, DisclaimerComponentProvider, className, catalogItems } = props;
28
28
  const { permissions, loading } = usePermissions();
29
- const { allowNativeLinks } = useConfig();
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,kDAiExF"}
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":"AAsBA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AA6BvD,KAAK,gCAAgC,GAAG;IACpC,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,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,SAAiB,EACjB,WAAmB,EACnB,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,aAAa,EAChB,EAAE,gCAAgC,2CAsIlC"}
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, useId, useMemo, useState } from "react";
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] = useState("");
35
- const isSearchFieldVisible = inputItems.length > SEARCH_FIELD_VISIBILITY_THRESHOLD;
36
- const searchStringToUse = isSearchFieldVisible ? searchString : "";
37
- const normalizedSearch = searchStringToUse.trim().toLowerCase();
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
- return inputItems.filter((item) => item.title.toLowerCase().includes(normalizedSearch));
43
- }, [inputItems, normalizedSearch]);
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 && filteredItems.length === 0;
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 canLoadNextPage = hasNextPage && normalizedSearch.length === 0;
61
- const shouldShowPagedList = !hasNoData || canLoadNextPage;
62
- const skeletonItemsCount = isLoading || (canLoadNextPage && filteredItems.length === 0) ? LOADING_SKELETON_ITEMS_COUNT : 0;
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: searchStringToUse, onChange: (value) => setSearchString(String(value)), onEscKeyPress: onEscKeyPress, placeholder: intl.formatMessage(msgs.searchPlaceholder), autofocus: true, clearOnEsc: true, isSearch: true, isSmall: true, type: "search", accessibilityConfig: {
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 ? filteredItems.length : undefined, resultValues: filteredItems.length <= DETAILED_ANNOUNCEMENT_THRESHOLD
75
- ? filteredItems.map((item) => item.title)
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: filteredItems, itemHeight: DEFAULT_ITEM_HEIGHT, itemsGap: 0, itemPadding: 0, skeletonItemsCount: skeletonItemsCount, isLoading: isLoading, hasNextPage: canLoadNextPage, loadNextPage: loadNextPage, representAs: "listbox", closeDropdown: closeDropdown, onKeyDownConfirm: handleSelect, listboxProps: {
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;AAG3D,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"}
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;AAQ9E,OAAO,EAAsD,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE9G,wBAAgB,eAAe,CAC3B,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,MAAM,EAAE,iBAAiB,GAAG,SAAS;;;;;EAoDxC"}
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 ambientReferences = collectAvailableReferences(ambient, emptyReferenceLabel);
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
- ambientReferences.forEach((reference) => {
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
- ...toContextObjects(dashboards.items, "dashboard", emptyReferenceLabel),
28
- ...toContextObjects(visualizations.items, "visualization", emptyReferenceLabel),
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.items, visualizations.items, emptyReferenceLabel]);
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;AAInD,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,UAAU,GAAG,IAAI,EAC5B,SAAS,EAAE,OAAO,EAClB,IAAI,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,2EAiC5B"}
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 && !opts.isBusy && (forceFocusOnce.current || document.activeElement === document.body),
15
- refocusKey: opts.isBusy,
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":"AAKA,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;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EACjC,KAAK,EACL,eAAe,EACf,UAAU,EACV,sBAAsB,EACzB,EAAE,0BAA0B,2CAc5B"}
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">, contextObjectsLoadingAction: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
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;AAqChD,eAAO,MAAM,yBAAyB;;;0BAWpC,CAAC;AAkMH,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,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"}
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
@@ -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,CAKA;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"}
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"}
@@ -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: this.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":"AA4CA;;;GAGG;AACH,wBAAiB,QAAQ,4HA2BxB"}
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 loaded = yield call(kind === "dashboard" ? queryDashboardsPage : queryVisualizationsPage, page);
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
+ }
@@ -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 declare const getStore: (backend: IAnalyticalBackend, workspace: string, eventDispatcher: EventDispatcher, optionsDispatcher: OptionsDispatcher, isPreview: boolean | undefined, allowInteractionIntelligence: boolean | undefined) => import("redux").Store<any, import("redux").UnknownAction, unknown>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAOpE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAStD,eAAO,MAAM,QAAQ,mRAyCpB,CAAC"}
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"}
@@ -40,5 +40,7 @@ export const getStore = (backend, workspace, eventDispatcher, optionsDispatcher,
40
40
  },
41
41
  });
42
42
  sagaMiddleware.run(rootSaga);
43
+ // Save optionsDispatcher
44
+ store.optionsDispatcher = optionsDispatcher;
43
45
  return store;
44
46
  };
package/esm/types.d.ts CHANGED
@@ -126,6 +126,7 @@ export type ContextObjectListState = {
126
126
  loadedPages: number;
127
127
  hasNextPage: boolean;
128
128
  isLoading: boolean;
129
+ isExternal: boolean;
129
130
  };
130
131
  /**
131
132
  * State of the object lists offered by the context chooser. Each kind is paged on its own.
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-gen-ai",
3
- "version": "11.53.0-alpha.5",
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.5",
61
- "@gooddata/sdk-backend-spi": "11.53.0-alpha.5",
62
- "@gooddata/sdk-ui": "11.53.0-alpha.5",
63
- "@gooddata/sdk-model": "11.53.0-alpha.5",
64
- "@gooddata/sdk-ui-charts": "11.53.0-alpha.5",
65
- "@gooddata/sdk-ui-dashboard": "11.53.0-alpha.5",
66
- "@gooddata/sdk-ui-filters": "11.53.0-alpha.5",
67
- "@gooddata/sdk-ui-kit": "11.53.0-alpha.5",
68
- "@gooddata/sdk-ui-pivot": "11.53.0-alpha.5",
69
- "@gooddata/sdk-ui-semantic-search": "11.53.0-alpha.5",
70
- "@gooddata/sdk-ui-theme-provider": "11.53.0-alpha.5",
71
- "@gooddata/util": "11.53.0-alpha.5"
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.5",
115
- "@gooddata/i18n-toolkit": "11.53.0-alpha.5",
116
- "@gooddata/oxlint-config": "11.53.0-alpha.5",
117
- "@gooddata/reference-workspace": "11.53.0-alpha.5",
118
- "@gooddata/sdk-backend-mockingbird": "11.53.0-alpha.5",
119
- "@gooddata/sdk-ui-theme-provider": "11.53.0-alpha.5",
120
- "@gooddata/stylelint-config": "11.53.0-alpha.5"
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",