@gooddata/sdk-ui-semantic-search 10.37.0 → 10.38.0-alpha.2
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/SearchItem.d.ts +20 -0
- package/esm/SearchItem.d.ts.map +1 -0
- package/esm/SearchItem.js +28 -0
- package/esm/SearchItem.js.map +1 -0
- package/esm/SemanticSearch.d.ts.map +1 -1
- package/esm/SemanticSearch.js +32 -11
- package/esm/SemanticSearch.js.map +1 -1
- package/esm/SemanticSearchItem.d.ts +11 -0
- package/esm/SemanticSearchItem.d.ts.map +1 -0
- package/esm/SemanticSearchItem.js +17 -0
- package/esm/SemanticSearchItem.js.map +1 -0
- package/esm/hooks/useSearchMetrics.d.ts +3 -4
- package/esm/hooks/useSearchMetrics.d.ts.map +1 -1
- package/esm/hooks/useSearchMetrics.js +12 -9
- package/esm/hooks/useSearchMetrics.js.map +1 -1
- package/esm/internal/GroupResultCounter.d.ts +8 -0
- package/esm/internal/GroupResultCounter.d.ts.map +1 -0
- package/esm/internal/GroupResultCounter.js +15 -0
- package/esm/internal/GroupResultCounter.js.map +1 -0
- package/esm/internal/HistorySearchTreeView.d.ts +12 -0
- package/esm/internal/HistorySearchTreeView.d.ts.map +1 -0
- package/esm/internal/HistorySearchTreeView.js +30 -0
- package/esm/internal/HistorySearchTreeView.js.map +1 -0
- package/esm/internal/HistorySearchTreeViewItem.d.ts +7 -0
- package/esm/internal/HistorySearchTreeViewItem.d.ts.map +1 -0
- package/esm/internal/HistorySearchTreeViewItem.js +19 -0
- package/esm/internal/HistorySearchTreeViewItem.js.map +1 -0
- package/esm/internal/LeveledSearchTreeView.d.ts +22 -0
- package/esm/internal/LeveledSearchTreeView.d.ts.map +1 -0
- package/esm/internal/LeveledSearchTreeView.js +84 -0
- package/esm/internal/LeveledSearchTreeView.js.map +1 -0
- package/esm/internal/LeveledSearchTreeViewItem.d.ts +11 -0
- package/esm/internal/LeveledSearchTreeViewItem.d.ts.map +1 -0
- package/esm/internal/LeveledSearchTreeViewItem.js +24 -0
- package/esm/internal/LeveledSearchTreeViewItem.js.map +1 -0
- package/esm/internal/SearchItemDetails.d.ts +12 -0
- package/esm/internal/SearchItemDetails.d.ts.map +1 -0
- package/esm/{utils/renderDetails.js → internal/SearchItemDetails.js} +33 -27
- package/esm/internal/SearchItemDetails.js.map +1 -0
- package/esm/internal/SearchItemIcon.d.ts +13 -0
- package/esm/internal/SearchItemIcon.d.ts.map +1 -0
- package/esm/internal/SearchItemIcon.js +46 -0
- package/esm/internal/SearchItemIcon.js.map +1 -0
- package/esm/internal/SearchOverlay.d.ts +4 -5
- package/esm/internal/SearchOverlay.d.ts.map +1 -1
- package/esm/internal/SearchOverlay.js +58 -97
- package/esm/internal/SearchOverlay.js.map +1 -1
- package/esm/internal/UpdateDate.d.ts +2 -3
- package/esm/internal/UpdateDate.d.ts.map +1 -1
- package/esm/internal/UpdateDate.js +7 -5
- package/esm/internal/UpdateDate.js.map +1 -1
- package/esm/localization/bundles/en-US.json +16 -0
- package/esm/localization/bundles/en-US.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/en-US.localization-bundle.js +4 -0
- package/esm/localization/bundles/en-US.localization-bundle.js.map +1 -1
- package/esm/utils/getAriaLabel.d.ts +5 -0
- package/esm/utils/getAriaLabel.d.ts.map +1 -0
- package/esm/utils/getAriaLabel.js +27 -0
- package/esm/utils/getAriaLabel.js.map +1 -0
- package/esm/utils/searchItem.d.ts +8 -0
- package/esm/utils/searchItem.d.ts.map +1 -0
- package/esm/utils/searchItem.js +15 -0
- package/esm/utils/searchItem.js.map +1 -0
- package/package.json +14 -14
- package/styles/css/internal.css +62 -43
- package/styles/css/internal.css.map +1 -1
- package/styles/css/main.css +61 -23
- package/styles/css/main.css.map +1 -1
- package/styles/scss/internal.scss +1 -17
- package/styles/scss/main.scss +64 -16
- package/esm/ResultsItem.d.ts +0 -9
- package/esm/ResultsItem.d.ts.map +0 -1
- package/esm/ResultsItem.js +0 -16
- package/esm/ResultsItem.js.map +0 -1
- package/esm/SearchListItem.d.ts +0 -15
- package/esm/SearchListItem.d.ts.map +0 -1
- package/esm/SearchListItem.js +0 -30
- package/esm/SearchListItem.js.map +0 -1
- package/esm/SearchResultsDropdownList.d.ts +0 -36
- package/esm/SearchResultsDropdownList.d.ts.map +0 -1
- package/esm/SearchResultsDropdownList.js +0 -20
- package/esm/SearchResultsDropdownList.js.map +0 -1
- package/esm/internal/AnnotatedResultsItem.d.ts +0 -9
- package/esm/internal/AnnotatedResultsItem.d.ts.map +0 -1
- package/esm/internal/AnnotatedResultsItem.js +0 -26
- package/esm/internal/AnnotatedResultsItem.js.map +0 -1
- package/esm/internal/HistoryItem.d.ts +0 -11
- package/esm/internal/HistoryItem.d.ts.map +0 -1
- package/esm/internal/HistoryItem.js +0 -19
- package/esm/internal/HistoryItem.js.map +0 -1
- package/esm/internal/SearchList.d.ts +0 -30
- package/esm/internal/SearchList.d.ts.map +0 -1
- package/esm/internal/SearchList.js +0 -18
- package/esm/internal/SearchList.js.map +0 -1
- package/esm/types.d.ts +0 -34
- package/esm/types.d.ts.map +0 -1
- package/esm/types.js +0 -3
- package/esm/types.js.map +0 -1
- package/esm/utils/getAreaLabel.d.ts +0 -4
- package/esm/utils/getAreaLabel.d.ts.map +0 -1
- package/esm/utils/getAreaLabel.js +0 -15
- package/esm/utils/getAreaLabel.js.map +0 -1
- package/esm/utils/renderDetails.d.ts +0 -8
- package/esm/utils/renderDetails.d.ts.map +0 -1
- package/esm/utils/renderDetails.js.map +0 -1
- package/esm/utils/renderItemIcon.d.ts +0 -8
- package/esm/utils/renderItemIcon.d.ts.map +0 -1
- package/esm/utils/renderItemIcon.js +0 -44
- package/esm/utils/renderItemIcon.js.map +0 -1
- package/esm/utils/renderLock.d.ts +0 -5
- package/esm/utils/renderLock.d.ts.map +0 -1
- package/esm/utils/renderLock.js +0 -9
- package/esm/utils/renderLock.js.map +0 -1
@@ -0,0 +1,20 @@
|
|
1
|
+
import React from "react";
|
2
|
+
export type SearchItemProps = {
|
3
|
+
className?: string;
|
4
|
+
children: React.ReactNode;
|
5
|
+
ariaLabel: string;
|
6
|
+
level: number;
|
7
|
+
icon: React.ReactNode;
|
8
|
+
details?: React.ReactNode;
|
9
|
+
resultCounter?: React.ReactNode;
|
10
|
+
href?: string;
|
11
|
+
isFocused?: boolean;
|
12
|
+
onClick: (event: React.MouseEvent) => void;
|
13
|
+
onHover: (event: React.MouseEvent) => void;
|
14
|
+
};
|
15
|
+
/**
|
16
|
+
* A single result item in the search results.
|
17
|
+
* @internal
|
18
|
+
*/
|
19
|
+
export declare const SearchItem: ({ className, children, ariaLabel, level, isFocused, icon, details, resultCounter, href, onClick, onHover, }: SearchItemProps) => React.JSX.Element;
|
20
|
+
//# sourceMappingURL=SearchItem.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SearchItem.d.ts","sourceRoot":"","sources":["../src/SearchItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,eAAe,GAAG;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAC3C,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CAC9C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,6GAYxB,eAAe,sBAiCjB,CAAC"}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
// (C) 2024-2025 GoodData Corporation
|
2
|
+
import React from "react";
|
3
|
+
import classnames from "classnames";
|
4
|
+
/**
|
5
|
+
* A single result item in the search results.
|
6
|
+
* @internal
|
7
|
+
*/
|
8
|
+
export const SearchItem = ({ className, children, ariaLabel, level, isFocused, icon, details, resultCounter, href, onClick, onHover, }) => {
|
9
|
+
const handleClick = (event) => {
|
10
|
+
// Only report left and middle clicks
|
11
|
+
if (event.button < 2) {
|
12
|
+
onClick(event);
|
13
|
+
}
|
14
|
+
};
|
15
|
+
const Tag = href ? "a" : "div";
|
16
|
+
const wrapperClassName = classnames(className, {
|
17
|
+
"gd-semantic-search__results-item": true,
|
18
|
+
"gd-semantic-search__results-item--active": isFocused,
|
19
|
+
});
|
20
|
+
return (React.createElement("div", { className: wrapperClassName, "data-level": level },
|
21
|
+
React.createElement(Tag, { "aria-label": ariaLabel, href: href, className: "gd-semantic-search__results-item__content", onClick: handleClick, onAuxClick: handleClick, onMouseEnter: onHover },
|
22
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__icon" }, icon),
|
23
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text" }, children),
|
24
|
+
React.createElement("div", { className: "gd-semantic-search__results-item__details-container" },
|
25
|
+
!!isFocused && level === 1 && details,
|
26
|
+
resultCounter))));
|
27
|
+
};
|
28
|
+
//# sourceMappingURL=SearchItem.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SearchItem.js","sourceRoot":"","sources":["../src/SearchItem.tsx"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,UAAU,MAAM,YAAY,CAAC;AAgBpC;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EACvB,SAAS,EACT,QAAQ,EACR,SAAS,EACT,KAAK,EACL,SAAS,EACT,IAAI,EACJ,OAAO,EACP,aAAa,EACb,IAAI,EACJ,OAAO,EACP,OAAO,GACO,EAAE,EAAE;IAClB,MAAM,WAAW,GAAG,CAAC,KAAuB,EAAE,EAAE;QAC5C,qCAAqC;QACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/B,MAAM,gBAAgB,GAAG,UAAU,CAAC,SAAS,EAAE;QAC3C,kCAAkC,EAAE,IAAI;QACxC,0CAA0C,EAAE,SAAS;KACxD,CAAC,CAAC;IAEH,OAAO,CACH,6BAAK,SAAS,EAAE,gBAAgB,gBAAc,KAAK;QAC/C,oBAAC,GAAG,kBACY,SAAS,EACrB,IAAI,EAAE,IAAI,EACV,SAAS,EAAC,2CAA2C,EACrD,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,WAAW,EACvB,YAAY,EAAE,OAAO;YAErB,8BAAM,SAAS,EAAC,wCAAwC,IAAE,IAAI,CAAQ;YACtE,8BAAM,SAAS,EAAC,wCAAwC,IAAE,QAAQ,CAAQ;YAC1E,6BAAK,SAAS,EAAC,qDAAqD;gBAC/D,CAAC,CAAC,SAAS,IAAI,KAAK,KAAK,CAAC,IAAI,OAAO;gBACrC,aAAa,CACZ,CACJ,CACJ,CACT,CAAC;AACN,CAAC,CAAC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SemanticSearch.d.ts","sourceRoot":"","sources":["../src/SemanticSearch.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
1
|
+
{"version":3,"file":"SemanticSearch.d.ts","sourceRoot":"","sources":["../src/SemanticSearch.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAY/B,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAK/D;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC9B;;OAEG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE,yBAAyB,KAAK,IAAI,CAAC;IACpD;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,YAAY,CAAC,EAAE,CACX,KAAK,EAAE,mBAAmB,GAAG;QAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAChG,QAAQ,EAAE;QACN,WAAW,EAAE,MAAM,IAAI,CAAC;KAC3B,KACA,KAAK,CAAC,SAAS,CAAC;CACxB,CAAC;AAiKF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAQxD,CAAC"}
|
package/esm/SemanticSearch.js
CHANGED
@@ -1,21 +1,27 @@
|
|
1
1
|
// (C) 2024-2025 GoodData Corporation
|
2
2
|
import * as React from "react";
|
3
|
-
import {
|
3
|
+
import { useIntl } from "react-intl";
|
4
|
+
import { Input, Dropdown, LoadingMask, UiStaticTreeview, UiTreeViewEventsProvider, useUiTreeViewEventPublisher, } from "@gooddata/sdk-ui-kit";
|
4
5
|
import { useDebouncedState } from "@gooddata/sdk-ui";
|
5
|
-
import { SearchResultsDropdownList } from "./SearchResultsDropdownList.js";
|
6
6
|
import { useSemanticSearch, useElementWidth } from "./hooks/index.js";
|
7
7
|
import classnames from "classnames";
|
8
8
|
import { IntlWrapper } from "./localization/IntlWrapper.js";
|
9
|
+
import { SemanticSearchItem } from "./SemanticSearchItem.js";
|
9
10
|
/**
|
10
11
|
* Search input debounce time.
|
11
12
|
* I.e. how long to wait after the user stops typing before sending the search request.
|
12
13
|
*/
|
13
14
|
const DEBOUNCE = 300;
|
15
|
+
/**
|
16
|
+
* Loading mask height.
|
17
|
+
*/
|
18
|
+
const LOADING_HEIGHT = 100;
|
14
19
|
/**
|
15
20
|
* Semantic search component core.
|
16
21
|
* @beta
|
17
22
|
*/
|
18
23
|
const SemanticSearchCore = (props) => {
|
24
|
+
const intl = useIntl();
|
19
25
|
const { backend, workspace, onSelect, onError, objectTypes, deepSearch = false, limit = 10, className, placeholder, renderFooter, } = props;
|
20
26
|
// Input value handling
|
21
27
|
const [value, setValue, searchTerm, setImmediate] = useDebouncedState("", DEBOUNCE);
|
@@ -29,8 +35,14 @@ const SemanticSearchCore = (props) => {
|
|
29
35
|
deepSearch,
|
30
36
|
limit,
|
31
37
|
});
|
32
|
-
// Build
|
33
|
-
const
|
38
|
+
// Build items for rendering
|
39
|
+
const items = searchResults.map((item) => ({
|
40
|
+
item: {
|
41
|
+
id: item.id,
|
42
|
+
stringTitle: item.title,
|
43
|
+
data: item,
|
44
|
+
},
|
45
|
+
}));
|
34
46
|
// The List component requires explicit width
|
35
47
|
const [ref, width] = useElementWidth();
|
36
48
|
// Report errors
|
@@ -50,17 +62,25 @@ const SemanticSearchCore = (props) => {
|
|
50
62
|
}
|
51
63
|
return React.createElement(React.Fragment, null, children);
|
52
64
|
};
|
65
|
+
const onKeyDown = useUiTreeViewEventPublisher("keydown");
|
53
66
|
return (React.createElement(Dropdown, { className: classnames("gd-semantic-search", className), ignoreClicksOnByClass: [
|
54
67
|
".gd-bubble",
|
55
68
|
".gd-input-icon-clear",
|
56
69
|
".gd-semantic-search__results-item",
|
57
70
|
".gd-semantic-search__input",
|
58
|
-
], closeOnEscape: false, renderBody: ({
|
59
|
-
if (
|
71
|
+
], closeOnEscape: false, renderBody: ({ closeDropdown, isMobile }) => {
|
72
|
+
if (searchStatus === "loading") {
|
73
|
+
return (React.createElement(Wrapper, { status: searchStatus, closeSearch: closeDropdown },
|
74
|
+
React.createElement(LoadingMask, { width: isMobile ? "100%" : width, height: LOADING_HEIGHT })));
|
75
|
+
}
|
76
|
+
if (items.length === 0 || searchStatus !== "success") {
|
60
77
|
return null;
|
61
78
|
}
|
62
79
|
return (React.createElement(Wrapper, { status: searchStatus, closeSearch: closeDropdown },
|
63
|
-
React.createElement(
|
80
|
+
React.createElement(UiStaticTreeview, { items: items, width: width, ItemComponent: SemanticSearchItem, ariaAttributes: {
|
81
|
+
id: "semantic-search-tree",
|
82
|
+
"aria-label": intl.formatMessage({ id: "semantic-search.tree" }),
|
83
|
+
}, onSelect: (item) => {
|
64
84
|
// Blur and clear the state
|
65
85
|
const input = inputRef.current?.inputNodeRef?.inputNodeRef;
|
66
86
|
if (input) {
|
@@ -69,11 +89,11 @@ const SemanticSearchCore = (props) => {
|
|
69
89
|
setImmediate("");
|
70
90
|
closeDropdown();
|
71
91
|
// Report the selected item
|
72
|
-
onSelect(item);
|
73
|
-
} })));
|
92
|
+
onSelect(item.data);
|
93
|
+
}, shouldKeyboardActionPreventDefault: false })));
|
74
94
|
}, renderButton: ({ openDropdown }) => {
|
75
95
|
return (React.createElement("div", { ref: ref },
|
76
|
-
React.createElement(Input, { className: "gd-semantic-search__input", ref: inputRef, placeholder: placeholder, isSearch: true, clearOnEsc: true, value: value, onChange: (e) => setValue(String(e)), onFocus: openDropdown })));
|
96
|
+
React.createElement(Input, { className: "gd-semantic-search__input", ref: inputRef, placeholder: placeholder, isSearch: true, clearOnEsc: true, value: value, onChange: (e) => setValue(String(e)), onFocus: openDropdown, onKeyDown: onKeyDown })));
|
77
97
|
} }));
|
78
98
|
};
|
79
99
|
/**
|
@@ -82,6 +102,7 @@ const SemanticSearchCore = (props) => {
|
|
82
102
|
*/
|
83
103
|
export const SemanticSearch = ({ locale, ...coreProps }) => {
|
84
104
|
return (React.createElement(IntlWrapper, { locale: locale },
|
85
|
-
React.createElement(
|
105
|
+
React.createElement(UiTreeViewEventsProvider, null,
|
106
|
+
React.createElement(SemanticSearchCore, { ...coreProps }))));
|
86
107
|
};
|
87
108
|
//# sourceMappingURL=SemanticSearch.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SemanticSearch.js","sourceRoot":"","sources":["../src/SemanticSearch.tsx"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"SemanticSearch.js","sourceRoot":"","sources":["../src/SemanticSearch.tsx"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import * as React from "react";
|
2
|
+
import { ISemanticSearchResultItem } from "@gooddata/sdk-model";
|
3
|
+
import type { IUiTreeviewItemProps } from "@gooddata/sdk-ui-kit";
|
4
|
+
type Props = IUiTreeviewItemProps<ISemanticSearchResultItem>;
|
5
|
+
/**
|
6
|
+
* A single result item in the search results.
|
7
|
+
* @internal
|
8
|
+
*/
|
9
|
+
export declare function SemanticSearchItem(props: Props): React.JSX.Element;
|
10
|
+
export {};
|
11
|
+
//# sourceMappingURL=SemanticSearchItem.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SemanticSearchItem.d.ts","sourceRoot":"","sources":["../src/SemanticSearchItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAMjE,KAAK,KAAK,GAAG,oBAAoB,CAAC,yBAAyB,CAAC,CAAC;AAE7D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,qBAiB9C"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
// (C) 2024-2025 GoodData Corporation
|
2
|
+
import * as React from "react";
|
3
|
+
import { SearchItemIcon } from "./internal/SearchItemIcon.js";
|
4
|
+
import { SearchItemDetails } from "./internal/SearchItemDetails.js";
|
5
|
+
import { SearchItem } from "./SearchItem.js";
|
6
|
+
import { getAriaLabel } from "./utils/getAriaLabel.js";
|
7
|
+
/**
|
8
|
+
* A single result item in the search results.
|
9
|
+
* @internal
|
10
|
+
*/
|
11
|
+
export function SemanticSearchItem(props) {
|
12
|
+
const { item, level, isFocused, onSelect, onHover } = props;
|
13
|
+
return (React.createElement(SearchItem, { ariaLabel: getAriaLabel(item.data), level: level, onClick: onSelect, onHover: onHover, isFocused: isFocused, icon: React.createElement(SearchItemIcon, { item: item.data }), details: React.createElement(SearchItemDetails, { item: item.data }) },
|
14
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text__row" },
|
15
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text__ellipsis" }, item.stringTitle))));
|
16
|
+
}
|
17
|
+
//# sourceMappingURL=SemanticSearchItem.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SemanticSearchItem.js","sourceRoot":"","sources":["../src/SemanticSearchItem.tsx"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAIvD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAY;IAC3C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC5D,OAAO,CACH,oBAAC,UAAU,IACP,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAClC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,oBAAC,cAAc,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAI,EACzC,OAAO,EAAE,oBAAC,iBAAiB,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAI;QAE/C,8BAAM,SAAS,EAAC,6CAA6C;YACzD,8BAAM,SAAS,EAAC,kDAAkD,IAAE,IAAI,CAAC,WAAW,CAAQ,CACzF,CACE,CAChB,CAAC;AACN,CAAC"}
|
@@ -1,5 +1,4 @@
|
|
1
|
-
import { GenAIObjectType, ISemanticSearchResultItem } from "@gooddata/sdk-model";
|
2
|
-
import { ListItem } from "../types.js";
|
1
|
+
import { type GenAIObjectType, type ISemanticSearchRelationship, type ISemanticSearchResultItem } from "@gooddata/sdk-model";
|
3
2
|
/**
|
4
3
|
* A conclusion of a single search action by the user.
|
5
4
|
* Used to collect usage metrics.
|
@@ -40,8 +39,8 @@ export type ISearchMetrics = {
|
|
40
39
|
export type UseSearchMetricsCallback = (metricsData: ISearchMetrics) => void;
|
41
40
|
export type UseSearchMetricsReturn = {
|
42
41
|
onCloseMetrics: () => void;
|
43
|
-
onSelectMetrics: (item: ISemanticSearchResultItem, index?: number) => void;
|
44
|
-
onSearchMetrics: (searchTerm: string, searchResults?:
|
42
|
+
onSelectMetrics: (item: ISemanticSearchResultItem | ISemanticSearchRelationship, index?: number) => void;
|
43
|
+
onSearchMetrics: (searchTerm: string, searchResults?: ISemanticSearchResultItem[]) => void;
|
45
44
|
};
|
46
45
|
/**
|
47
46
|
* A hook that helps to collect usage metrics for the search overlay.
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useSearchMetrics.d.ts","sourceRoot":"","sources":["../../src/hooks/useSearchMetrics.ts"],"names":[],"mappings":"AAGA,OAAO,
|
1
|
+
{"version":3,"file":"useSearchMetrics.d.ts","sourceRoot":"","sources":["../../src/hooks/useSearchMetrics.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,KAAK,eAAe,EACpB,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EACjC,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IACzB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,gBAAgB,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC;;OAEG;IACH,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;OAEG;IACH,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,CAAC,WAAW,EAAE,cAAc,KAAK,IAAI,CAAC;AAE7E,MAAM,MAAM,sBAAsB,GAAG;IACjC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,eAAe,EAAE,CAAC,IAAI,EAAE,yBAAyB,GAAG,2BAA2B,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzG,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,yBAAyB,EAAE,KAAK,IAAI,CAAC;CAC9F,CAAC;AAoBF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAW,wBAAwB,KAAG,sBAyEtE,CAAC"}
|
@@ -1,5 +1,6 @@
|
|
1
|
-
// (C) 2024 GoodData Corporation
|
1
|
+
// (C) 2024-2025 GoodData Corporation
|
2
2
|
import * as React from "react";
|
3
|
+
import { isSemanticSearchResultItem, } from "@gooddata/sdk-model";
|
3
4
|
const defaultOnSearchMetrics = {
|
4
5
|
state: {
|
5
6
|
lastSearchTerm: "",
|
@@ -44,13 +45,15 @@ export const useSearchMetrics = (callback) => {
|
|
44
45
|
// Callback will be called when the user selects an item
|
45
46
|
const onSelectMetrics = React.useCallback((item, index) => {
|
46
47
|
// Report the metrics
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
48
|
+
if (isSemanticSearchResultItem(item)) {
|
49
|
+
callback?.({
|
50
|
+
...searchMetricsRef.current.state,
|
51
|
+
selectedItemTitle: item.title,
|
52
|
+
selectedItemType: item.type,
|
53
|
+
selectedItemScore: item.score ?? 0,
|
54
|
+
selectedItemIndex: index ?? null,
|
55
|
+
});
|
56
|
+
}
|
54
57
|
// Mark the metrics as reported
|
55
58
|
// Do not flush the metric data, because user might select several items in sequence
|
56
59
|
// e.g. when cmd+click and open it in a new tab
|
@@ -68,7 +71,7 @@ export const useSearchMetrics = (callback) => {
|
|
68
71
|
state: {
|
69
72
|
...searchMetricsRef.current.state,
|
70
73
|
lastSearchTerm: searchTerm,
|
71
|
-
lastSearchScores: searchResults?.map((result) => result.
|
74
|
+
lastSearchScores: searchResults?.map((result) => result.score ?? 0) ?? [],
|
72
75
|
searchCount: shouldIncrement ? searchCount + 1 : searchCount,
|
73
76
|
},
|
74
77
|
reported: false,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useSearchMetrics.js","sourceRoot":"","sources":["../../src/hooks/useSearchMetrics.ts"],"names":[],"mappings":"AAAA,
|
1
|
+
{"version":3,"file":"useSearchMetrics.js","sourceRoot":"","sources":["../../src/hooks/useSearchMetrics.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"GroupResultCounter.d.ts","sourceRoot":"","sources":["../../src/internal/GroupResultCounter.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,KAAK,KAAK,GAAG;IACT,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,4BAiB9D"}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
// (C) 2025 GoodData Corporation
|
2
|
+
import { UiIcon } from "@gooddata/sdk-ui-kit";
|
3
|
+
import cx from "classnames";
|
4
|
+
import React from "react";
|
5
|
+
import { FormattedMessage } from "react-intl";
|
6
|
+
export function GroupResultCounter({ count, isExpanded }) {
|
7
|
+
if (!count) {
|
8
|
+
return null;
|
9
|
+
}
|
10
|
+
return (React.createElement("div", { className: "gd-semantic-search__results-item__counter" },
|
11
|
+
React.createElement(FormattedMessage, { tagName: "span", id: "semantic-search.results.count", values: { count } }),
|
12
|
+
React.createElement("div", { className: cx("gd-semantic-search__results-item__counter__icon", isExpanded && "gd-semantic-search__results-item__counter__icon--expanded") },
|
13
|
+
React.createElement(UiIcon, { type: "navigateRight", size: 16, color: "complementary-6" }))));
|
14
|
+
}
|
15
|
+
//# sourceMappingURL=GroupResultCounter.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"GroupResultCounter.js","sourceRoot":"","sources":["../../src/internal/GroupResultCounter.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAO9C,MAAM,UAAU,kBAAkB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAS;IAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,CACH,6BAAK,SAAS,EAAC,2CAA2C;QACtD,oBAAC,gBAAgB,IAAC,OAAO,EAAC,MAAM,EAAC,EAAE,EAAC,+BAA+B,EAAC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAI;QACzF,6BACI,SAAS,EAAE,EAAE,CACT,iDAAiD,EACjD,UAAU,IAAI,2DAA2D,CAC5E;YAED,oBAAC,MAAM,IAAC,IAAI,EAAC,eAAe,EAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAC,iBAAiB,GAAG,CAC/D,CACJ,CACT,CAAC;AACN,CAAC"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import React from "react";
|
2
|
+
type Props = {
|
3
|
+
searchHistory: string[];
|
4
|
+
onSelect: (value: string) => void;
|
5
|
+
};
|
6
|
+
/**
|
7
|
+
* A tree view component for history search results.
|
8
|
+
* @internal
|
9
|
+
*/
|
10
|
+
export declare function HistorySearchTreeView({ searchHistory, onSelect }: Props): React.JSX.Element;
|
11
|
+
export {};
|
12
|
+
//# sourceMappingURL=HistorySearchTreeView.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"HistorySearchTreeView.d.ts","sourceRoot":"","sources":["../../src/internal/HistorySearchTreeView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAK3C,KAAK,KAAK,GAAG;IACT,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,KAAK,qBAuBvE"}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
// (C) 2025 GoodData Corporation
|
2
|
+
import React, { useCallback } from "react";
|
3
|
+
import { UiStaticTreeview } from "@gooddata/sdk-ui-kit";
|
4
|
+
import { useIntl } from "react-intl";
|
5
|
+
import { HistorySearchTreeViewItem } from "./HistorySearchTreeViewItem.js";
|
6
|
+
/**
|
7
|
+
* A tree view component for history search results.
|
8
|
+
* @internal
|
9
|
+
*/
|
10
|
+
export function HistorySearchTreeView({ searchHistory, onSelect }) {
|
11
|
+
const intl = useIntl();
|
12
|
+
const items = buildItems(searchHistory);
|
13
|
+
const handleSelect = useCallback((item) => {
|
14
|
+
onSelect(item.data);
|
15
|
+
}, [onSelect]);
|
16
|
+
return (React.createElement(UiStaticTreeview, { items: items, ariaAttributes: {
|
17
|
+
id: "semantic-search-tree-history",
|
18
|
+
"aria-label": intl.formatMessage({ id: "semantic-search.tree.history" }),
|
19
|
+
}, onSelect: handleSelect, ItemComponent: HistorySearchTreeViewItem, shouldKeyboardActionPreventDefault: false }));
|
20
|
+
}
|
21
|
+
function buildItems(searchHistory) {
|
22
|
+
return searchHistory.map((value) => ({
|
23
|
+
item: {
|
24
|
+
id: value,
|
25
|
+
stringTitle: value,
|
26
|
+
data: value,
|
27
|
+
},
|
28
|
+
}));
|
29
|
+
}
|
30
|
+
//# sourceMappingURL=HistorySearchTreeView.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"HistorySearchTreeView.js","sourceRoot":"","sources":["../../src/internal/HistorySearchTreeView.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAA+C,MAAM,sBAAsB,CAAC;AACrG,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAO3E;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAS;IACpE,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAExC,MAAM,YAAY,GAAG,WAAW,CAC5B,CAAC,IAA6B,EAAE,EAAE;QAC9B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC,EACD,CAAC,QAAQ,CAAC,CACb,CAAC;IAEF,OAAO,CACH,oBAAC,gBAAgB,IACb,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE;YACZ,EAAE,EAAE,8BAA8B;YAClC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,8BAA8B,EAAE,CAAC;SAC3E,EACD,QAAQ,EAAE,YAAY,EACtB,aAAa,EAAE,yBAAyB,EACxC,kCAAkC,EAAE,KAAK,GAC3C,CACL,CAAC;AACN,CAAC;AAED,SAAS,UAAU,CAAC,aAAuB;IACvC,OAAO,aAAa,CAAC,GAAG,CACpB,CAAC,KAAK,EAA4B,EAAE,CAAC,CAAC;QAClC,IAAI,EAAE;YACF,EAAE,EAAE,KAAK;YACT,WAAW,EAAE,KAAK;YAClB,IAAI,EAAE,KAAK;SACd;KACJ,CAAC,CACL,CAAC;AACN,CAAC"}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import { type IUiTreeviewItemProps } from "@gooddata/sdk-ui-kit";
|
3
|
+
/**
|
4
|
+
* @internal
|
5
|
+
*/
|
6
|
+
export declare function HistorySearchTreeViewItem(props: IUiTreeviewItemProps<string>): React.JSX.Element;
|
7
|
+
//# sourceMappingURL=HistorySearchTreeViewItem.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"HistorySearchTreeViewItem.d.ts","sourceRoot":"","sources":["../../src/internal/HistorySearchTreeViewItem.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAQ,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAKvE;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,oBAAoB,CAAC,MAAM,CAAC,qBAoB5E"}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
// (C) 2025 GoodData Corporation
|
2
|
+
import React from "react";
|
3
|
+
import { Icon } from "@gooddata/sdk-ui-kit";
|
4
|
+
import { SearchItem } from "../SearchItem.js";
|
5
|
+
import { useTheme } from "@gooddata/sdk-ui-theme-provider";
|
6
|
+
import { useIntl } from "react-intl";
|
7
|
+
/**
|
8
|
+
* @internal
|
9
|
+
*/
|
10
|
+
export function HistorySearchTreeViewItem(props) {
|
11
|
+
const { item, isFocused, level, onSelect, onHover } = props;
|
12
|
+
const theme = useTheme();
|
13
|
+
const intl = useIntl();
|
14
|
+
const ariaLabel = intl.formatMessage({ id: "semantic-search.previous-search" });
|
15
|
+
return (React.createElement(SearchItem, { ariaLabel: ariaLabel, level: level, onClick: onSelect, onHover: onHover, isFocused: isFocused, icon: React.createElement(Icon.HistoryBack, { color: theme?.palette?.complementary?.c5 ?? "#B0BECA" }) },
|
16
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text__row" },
|
17
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text__ellipsis" }, item.stringTitle))));
|
18
|
+
}
|
19
|
+
//# sourceMappingURL=HistorySearchTreeViewItem.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"HistorySearchTreeViewItem.js","sourceRoot":"","sources":["../../src/internal/HistorySearchTreeViewItem.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAA6B,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAmC;IACzE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC5D,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,iCAAiC,EAAE,CAAC,CAAC;IAEhF,OAAO,CACH,oBAAC,UAAU,IACP,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,oBAAC,IAAI,CAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,SAAS,GAAI;QAEjF,8BAAM,SAAS,EAAC,6CAA6C;YACzD,8BAAM,SAAS,EAAC,kDAAkD,IAAE,IAAI,CAAC,WAAW,CAAQ,CACzF,CACE,CAChB,CAAC;AACN,CAAC"}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import type { ISemanticSearchResultItem, ISemanticSearchRelationship } from "@gooddata/sdk-model";
|
3
|
+
import { type UiLeveledTreeView, type OnLeveledSelectFn } from "@gooddata/sdk-ui-kit";
|
4
|
+
export type SearchTreeViewLevels = [
|
5
|
+
ISemanticSearchResultItem,
|
6
|
+
ISemanticSearchResultItem | ISemanticSearchRelationship
|
7
|
+
];
|
8
|
+
export type SearchTreeViewItem = UiLeveledTreeView<SearchTreeViewLevels>;
|
9
|
+
type Props = {
|
10
|
+
workspace: string;
|
11
|
+
searchResults: ISemanticSearchResultItem[];
|
12
|
+
searchRelationships: ISemanticSearchRelationship[];
|
13
|
+
threshold?: number;
|
14
|
+
onSelect: OnLeveledSelectFn<SearchTreeViewLevels>;
|
15
|
+
};
|
16
|
+
/**
|
17
|
+
* A tree view component for semantic search results.
|
18
|
+
* @internal
|
19
|
+
*/
|
20
|
+
export declare function LeveledSearchTreeView(props: Props): React.JSX.Element;
|
21
|
+
export {};
|
22
|
+
//# sourceMappingURL=LeveledSearchTreeView.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"LeveledSearchTreeView.d.ts","sourceRoot":"","sources":["../../src/internal/LeveledSearchTreeView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAqB,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKzG,MAAM,MAAM,oBAAoB,GAAG;IAC/B,yBAAyB;IACzB,yBAAyB,GAAG,2BAA2B;CAC1D,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;AAEzE,KAAK,KAAK,GAAG;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,yBAAyB,EAAE,CAAC;IAC3C,mBAAmB,EAAE,2BAA2B,EAAE,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;CACrD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,qBAmBjD"}
|
@@ -0,0 +1,84 @@
|
|
1
|
+
// (C) 2025 GoodData Corporation
|
2
|
+
import React from "react";
|
3
|
+
import { useIntl } from "react-intl";
|
4
|
+
import { UiLeveledTreeview } from "@gooddata/sdk-ui-kit";
|
5
|
+
import { LeveledSearchTreeViewItemMemo } from "./LeveledSearchTreeViewItem.js";
|
6
|
+
import { getItemRelationships, isItemLocked, isRelationshipLocked } from "../utils/searchItem.js";
|
7
|
+
import { getUIPath } from "../utils/getUIPath.js";
|
8
|
+
/**
|
9
|
+
* A tree view component for semantic search results.
|
10
|
+
* @internal
|
11
|
+
*/
|
12
|
+
export function LeveledSearchTreeView(props) {
|
13
|
+
const intl = useIntl();
|
14
|
+
const items = buildItems(props, intl);
|
15
|
+
return (React.createElement(UiLeveledTreeview, { items: items, maxHeight: 500, ariaAttributes: {
|
16
|
+
id: "leveled-semantic-search-tree",
|
17
|
+
"aria-label": intl.formatMessage({ id: "semantic-search.tree" }),
|
18
|
+
}, expandedMode: "default-collapsed", selectionMode: "leafs-only", onSelect: props.onSelect, ItemComponent: LeveledSearchTreeViewItemMemo, shouldKeyboardActionPreventDefault: false, isDisabledFocusable // For displaying locked items
|
19
|
+
: true }));
|
20
|
+
}
|
21
|
+
function buildItems({ workspace, searchResults, searchRelationships, threshold = 0.8 }, intl) {
|
22
|
+
return searchResults
|
23
|
+
.filter((item) => {
|
24
|
+
// Filter out items with similarity score below the threshold
|
25
|
+
return (item.score ?? 0) >= threshold;
|
26
|
+
})
|
27
|
+
.map((item) => {
|
28
|
+
// Items are not actually disabled, but we need to display the lock icon for locked items,
|
29
|
+
// so this API is used for that purpose as a convenience.
|
30
|
+
const isDisabled = isItemLocked(item, workspace);
|
31
|
+
const url = getUIPath(item.type, item.id, workspace);
|
32
|
+
// Do not show relationships for dashboard items
|
33
|
+
if (item.type === "dashboard") {
|
34
|
+
return {
|
35
|
+
item: {
|
36
|
+
id: item.id,
|
37
|
+
stringTitle: item.title,
|
38
|
+
data: item,
|
39
|
+
isDisabled,
|
40
|
+
url,
|
41
|
+
},
|
42
|
+
};
|
43
|
+
}
|
44
|
+
const relationships = getItemRelationships(item, searchRelationships);
|
45
|
+
const children = relationships.map((relationship) => {
|
46
|
+
const isDisabled = isRelationshipLocked(relationship, workspace);
|
47
|
+
const url = getUIPath("dashboardVisualization", relationship.sourceObjectId, workspace, item.id);
|
48
|
+
return {
|
49
|
+
item: {
|
50
|
+
id: relationship.sourceObjectId,
|
51
|
+
stringTitle: relationship.sourceObjectTitle,
|
52
|
+
data: relationship,
|
53
|
+
isDisabled,
|
54
|
+
url,
|
55
|
+
icon: undefined, // Icon is rendered via ItemIcon component
|
56
|
+
},
|
57
|
+
};
|
58
|
+
});
|
59
|
+
// Add artificial "Edit" action item when there are relationships to display
|
60
|
+
if (children.length > 0) {
|
61
|
+
children.push({
|
62
|
+
item: {
|
63
|
+
id: item.id,
|
64
|
+
stringTitle: intl.formatMessage({ id: "semantic-search.edit" }),
|
65
|
+
icon: "pencil",
|
66
|
+
data: item,
|
67
|
+
isDisabled,
|
68
|
+
url,
|
69
|
+
},
|
70
|
+
});
|
71
|
+
}
|
72
|
+
return {
|
73
|
+
item: {
|
74
|
+
id: item.id,
|
75
|
+
stringTitle: item.title,
|
76
|
+
data: item,
|
77
|
+
isDisabled,
|
78
|
+
url,
|
79
|
+
},
|
80
|
+
children,
|
81
|
+
};
|
82
|
+
});
|
83
|
+
}
|
84
|
+
//# sourceMappingURL=LeveledSearchTreeView.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"LeveledSearchTreeView.js","sourceRoot":"","sources":["../../src/internal/LeveledSearchTreeView.tsx"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import * as React from "react";
|
2
|
+
import { type ISemanticSearchRelationship, type ISemanticSearchResultItem } from "@gooddata/sdk-model";
|
3
|
+
import { type IUiTreeviewItemProps } from "@gooddata/sdk-ui-kit";
|
4
|
+
type Props = IUiTreeviewItemProps<ISemanticSearchResultItem | ISemanticSearchRelationship>;
|
5
|
+
/**
|
6
|
+
* A single result item in the search results.
|
7
|
+
* @internal
|
8
|
+
*/
|
9
|
+
export declare const LeveledSearchTreeViewItemMemo: React.NamedExoticComponent<Props>;
|
10
|
+
export {};
|
11
|
+
//# sourceMappingURL=LeveledSearchTreeViewItem.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"LeveledSearchTreeViewItem.d.ts","sourceRoot":"","sources":["../../src/internal/LeveledSearchTreeViewItem.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAEH,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EACjC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAQ,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AASvE,KAAK,KAAK,GAAG,oBAAoB,CAAC,yBAAyB,GAAG,2BAA2B,CAAC,CAAC;AAE3F;;;GAGG;AACH,eAAO,MAAM,6BAA6B,mCA6BxC,CAAC"}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
// (C) 2024-2025 GoodData Corporation
|
2
|
+
import * as React from "react";
|
3
|
+
import { isSemanticSearchResultItem, } from "@gooddata/sdk-model";
|
4
|
+
import { Icon } from "@gooddata/sdk-ui-kit";
|
5
|
+
import { SearchItemDetails } from "./SearchItemDetails.js";
|
6
|
+
import { SearchItemIcon } from "./SearchItemIcon.js";
|
7
|
+
import { UpdatedDate } from "./UpdateDate.js";
|
8
|
+
import { SearchItem } from "../SearchItem.js";
|
9
|
+
import { getAriaLabel } from "../utils/getAriaLabel.js";
|
10
|
+
import { GroupResultCounter } from "./GroupResultCounter.js";
|
11
|
+
/**
|
12
|
+
* A single result item in the search results.
|
13
|
+
* @internal
|
14
|
+
*/
|
15
|
+
export const LeveledSearchTreeViewItemMemo = React.memo(function LeveledSearchTreeViewItem(props) {
|
16
|
+
const { item, type, level, isFocused, isExpanded, childCount, onSelect, onHover } = props;
|
17
|
+
const href = type === "leaf" ? item.url : undefined;
|
18
|
+
return (React.createElement(SearchItem, { ariaLabel: getAriaLabel(item.data), level: level, href: href, onClick: onSelect, onHover: onHover, isFocused: isFocused, icon: React.createElement(SearchItemIcon, { item: item.data, icon: item.icon }), details: React.createElement(SearchItemDetails, { item: item.data }), resultCounter: React.createElement(GroupResultCounter, { count: childCount, isExpanded: isExpanded }) },
|
19
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text__row" },
|
20
|
+
item.isDisabled ? (React.createElement(Icon.Lock, { className: "gd-semantic-search__results-item__text__lock-icon" })) : null,
|
21
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text__ellipsis" }, item.stringTitle)),
|
22
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text__row" }, isSemanticSearchResultItem(item.data) && level === 1 && (React.createElement(UpdatedDate, { createdAt: item.data.createdAt, modifiedAt: item.data.modifiedAt })))));
|
23
|
+
});
|
24
|
+
//# sourceMappingURL=LeveledSearchTreeViewItem.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"LeveledSearchTreeViewItem.js","sourceRoot":"","sources":["../../src/internal/LeveledSearchTreeViewItem.tsx"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EACH,0BAA0B,GAG7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,IAAI,EAA6B,MAAM,sBAAsB,CAAC;AAEvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAI7D;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,yBAAyB,CAAC,KAAY;IACnG,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC1F,MAAM,IAAI,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAEpD,OAAO,CACH,oBAAC,UAAU,IACP,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAClC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,oBAAC,cAAc,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,GAAI,EAC1D,OAAO,EAAE,oBAAC,iBAAiB,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAI,EAC/C,aAAa,EAAE,oBAAC,kBAAkB,IAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,GAAI;QAEhF,8BAAM,SAAS,EAAC,6CAA6C;YACxD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CACf,oBAAC,IAAI,CAAC,IAAI,IAAC,SAAS,EAAC,mDAAmD,GAAG,CAC9E,CAAC,CAAC,CAAC,IAAI;YACR,8BAAM,SAAS,EAAC,kDAAkD,IAAE,IAAI,CAAC,WAAW,CAAQ,CACzF;QACP,8BAAM,SAAS,EAAC,6CAA6C,IACxD,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CACrD,oBAAC,WAAW,IAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,GAAI,CACpF,CACE,CACE,CAChB,CAAC;AACN,CAAC,CAAC,CAAC"}
|