@gooddata/sdk-ui-semantic-search 10.10.0-alpha.9 → 10.10.0
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/ResultsItem.d.ts.map +1 -1
- package/esm/ResultsItem.js +5 -13
- package/esm/ResultsItem.js.map +1 -1
- package/esm/SearchListItem.d.ts +14 -0
- package/esm/SearchListItem.d.ts.map +1 -0
- package/esm/SearchListItem.js +28 -0
- package/esm/SearchListItem.js.map +1 -0
- package/esm/SearchResultsDropdownList.d.ts.map +1 -1
- package/esm/SearchResultsDropdownList.js +2 -1
- package/esm/SearchResultsDropdownList.js.map +1 -1
- package/esm/SemanticSearch.d.ts.map +1 -1
- package/esm/SemanticSearch.js +1 -2
- package/esm/SemanticSearch.js.map +1 -1
- package/esm/hooks/useSearchMetrics.d.ts +43 -0
- package/esm/hooks/useSearchMetrics.d.ts.map +1 -0
- package/esm/hooks/useSearchMetrics.js +75 -0
- package/esm/hooks/useSearchMetrics.js.map +1 -0
- package/esm/internal/AnnotatedResultsItem.d.ts +4 -0
- package/esm/internal/AnnotatedResultsItem.d.ts.map +1 -1
- package/esm/internal/AnnotatedResultsItem.js +14 -22
- package/esm/internal/AnnotatedResultsItem.js.map +1 -1
- package/esm/internal/HistoryItem.d.ts +1 -1
- package/esm/internal/HistoryItem.d.ts.map +1 -1
- package/esm/internal/HistoryItem.js +7 -13
- package/esm/internal/HistoryItem.js.map +1 -1
- package/esm/internal/SearchList.d.ts.map +1 -1
- package/esm/internal/SearchList.js +2 -1
- package/esm/internal/SearchList.js.map +1 -1
- package/esm/internal/SearchOverlay.d.ts +24 -3
- package/esm/internal/SearchOverlay.d.ts.map +1 -1
- package/esm/internal/SearchOverlay.js +72 -29
- package/esm/internal/SearchOverlay.js.map +1 -1
- package/esm/internal.d.ts +2 -2
- package/esm/internal.d.ts.map +1 -1
- package/esm/internal.js +2 -2
- package/esm/internal.js.map +1 -1
- package/esm/utils/renderDetails.js +1 -1
- package/esm/utils/renderDetails.js.map +1 -1
- package/esm/utils/renderItemIcon.d.ts +2 -3
- package/esm/utils/renderItemIcon.d.ts.map +1 -1
- package/esm/utils/renderItemIcon.js +2 -1
- package/esm/utils/renderItemIcon.js.map +1 -1
- package/esm/utils/{renderLoack.d.ts → renderLock.d.ts} +1 -1
- package/esm/utils/renderLock.d.ts.map +1 -0
- package/esm/utils/{renderLoack.js → renderLock.js} +1 -1
- package/esm/utils/renderLock.js.map +1 -0
- package/package.json +7 -7
- package/styles/css/internal.css +38 -108
- package/styles/css/internal.css.map +1 -1
- package/styles/css/main.css +21 -51
- package/styles/css/main.css.map +1 -1
- package/styles/scss/internal.scss +21 -66
- package/styles/scss/main.scss +26 -46
- package/esm/internal/HeaderMobileSearch.d.ts +0 -8
- package/esm/internal/HeaderMobileSearch.d.ts.map +0 -1
- package/esm/internal/HeaderMobileSearch.js +0 -18
- package/esm/internal/HeaderMobileSearch.js.map +0 -1
- package/esm/internal/HeaderSearchButton.d.ts +0 -31
- package/esm/internal/HeaderSearchButton.d.ts.map +0 -1
- package/esm/internal/HeaderSearchButton.js +0 -50
- package/esm/internal/HeaderSearchButton.js.map +0 -1
- package/esm/utils/renderLoack.d.ts.map +0 -1
- package/esm/utils/renderLoack.js.map +0 -1
package/esm/ResultsItem.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResultsItem.d.ts","sourceRoot":"","sources":["../src/ResultsItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"ResultsItem.d.ts","sourceRoot":"","sources":["../src/ResultsItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAK3C;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAU1E,CAAC"}
|
package/esm/ResultsItem.js
CHANGED
|
@@ -1,23 +1,15 @@
|
|
|
1
1
|
// (C) 2024 GoodData Corporation
|
|
2
2
|
import * as React from "react";
|
|
3
|
-
import { useTheme } from "@gooddata/sdk-ui-theme-provider";
|
|
4
|
-
import classnames from "classnames";
|
|
5
3
|
import { renderItemIcon } from "./utils/renderItemIcon.js";
|
|
6
4
|
import { renderDetails } from "./utils/renderDetails.js";
|
|
5
|
+
import { SearchListItem } from "./SearchListItem.js";
|
|
7
6
|
/**
|
|
8
7
|
* A single result item in the search results.
|
|
9
8
|
* @internal
|
|
10
9
|
*/
|
|
11
|
-
export const ResultsItem = (
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"gd-semantic-search__results-item": true,
|
|
16
|
-
"gd-semantic-search__results-item--active": isActive,
|
|
17
|
-
}), onPointerOver: () => setActive(listItem), onClick: (e) => onSelect(listItem, e.nativeEvent) },
|
|
18
|
-
React.createElement("span", { className: "gd-semantic-search__results-item__icon" }, renderItemIcon(listItem, { color: theme?.palette?.complementary?.c5 ?? "#B0BECA" })),
|
|
19
|
-
React.createElement("span", { className: "gd-semantic-search__results-item__text gd-semantic-search__results-item__text--result" },
|
|
20
|
-
React.createElement("span", { className: "gd-semantic-search__results-item__text__1" }, listItem.item.title)),
|
|
21
|
-
isActive ? renderDetails(listItem, theme) : null));
|
|
10
|
+
export const ResultsItem = (props) => {
|
|
11
|
+
return (React.createElement(SearchListItem, { ...props, renderIcon: renderItemIcon, renderDetails: renderDetails },
|
|
12
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text__row" },
|
|
13
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text__ellipsis" }, props.listItem.item.title))));
|
|
22
14
|
};
|
|
23
15
|
//# sourceMappingURL=ResultsItem.js.map
|
package/esm/ResultsItem.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResultsItem.js","sourceRoot":"","sources":["../src/ResultsItem.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ResultsItem.js","sourceRoot":"","sources":["../src/ResultsItem.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAuD,CAAC,KAAK,EAAE,EAAE;IACrF,OAAO,CACH,oBAAC,cAAc,OAAK,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa;QAC/E,8BAAM,SAAS,EAAC,6CAA6C;YACzD,8BAAM,SAAS,EAAC,kDAAkD,IAC7D,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CACvB,CACJ,CACM,CACpB,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { ITheme } from "@gooddata/sdk-model";
|
|
3
|
+
import { ListItem, ListItemProps } from "./types.js";
|
|
4
|
+
export type SearchListItemProps<T> = ListItemProps<T> & React.PropsWithChildren<{
|
|
5
|
+
renderIcon: (item: ListItem<T>, theme?: ITheme) => React.ReactElement;
|
|
6
|
+
renderDetails?: (item: ListItem<T>, theme?: ITheme) => React.ReactElement;
|
|
7
|
+
className?: string;
|
|
8
|
+
}>;
|
|
9
|
+
/**
|
|
10
|
+
* A single result item in the search results.
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
export declare const SearchListItem: <T>({ listItem, isActive, setActive, onSelect, renderIcon, renderDetails, className, children, }: SearchListItemProps<T>) => React.JSX.Element;
|
|
14
|
+
//# sourceMappingURL=SearchListItem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchListItem.d.ts","sourceRoot":"","sources":["../src/SearchListItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGrD,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,GACjD,KAAK,CAAC,iBAAiB,CAAC;IACpB,UAAU,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC,YAAY,CAAC;IACtE,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC,YAAY,CAAC;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC,CAAC;AAEP;;;GAGG;AACH,eAAO,MAAM,cAAc,gJAqC1B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// (C) 2024 GoodData Corporation
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { useTheme } from "@gooddata/sdk-ui-theme-provider";
|
|
4
|
+
import classnames from "classnames";
|
|
5
|
+
/**
|
|
6
|
+
* A single result item in the search results.
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export const SearchListItem = ({ listItem, isActive, setActive, onSelect, renderIcon, renderDetails, className, children, }) => {
|
|
10
|
+
const theme = useTheme();
|
|
11
|
+
const onPointerOver = () => setActive(listItem);
|
|
12
|
+
const onClick = (e) => {
|
|
13
|
+
if (e.button < 2) {
|
|
14
|
+
// Only report left and middle clicks
|
|
15
|
+
onSelect(listItem, e.nativeEvent);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const Tag = listItem.url ? "a" : "span";
|
|
19
|
+
const wrapperClassName = classnames(className, {
|
|
20
|
+
"gd-semantic-search__results-item": true,
|
|
21
|
+
"gd-semantic-search__results-item--active": isActive,
|
|
22
|
+
});
|
|
23
|
+
return (React.createElement(Tag, { href: listItem.url, className: wrapperClassName, onPointerOver: onPointerOver, onClick: onClick, onAuxClick: onClick },
|
|
24
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__icon" }, renderIcon(listItem, theme)),
|
|
25
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text" }, children),
|
|
26
|
+
renderDetails && isActive ? renderDetails(listItem, theme) : null));
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=SearchListItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchListItem.js","sourceRoot":"","sources":["../src/SearchListItem.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAE3D,OAAO,UAAU,MAAM,YAAY,CAAC;AASpC;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAK,EAC/B,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,UAAU,EACV,aAAa,EACb,SAAS,EACT,QAAQ,GACa,EAAE,EAAE;IACzB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,CAAC,CAAmB,EAAE,EAAE;QACpC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,qCAAqC;YACrC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;QACtC,CAAC;IACL,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IACxC,MAAM,gBAAgB,GAAG,UAAU,CAAC,SAAS,EAAE;QAC3C,kCAAkC,EAAE,IAAI;QACxC,0CAA0C,EAAE,QAAQ;KACvD,CAAC,CAAC;IAEH,OAAO,CACH,oBAAC,GAAG,IACA,IAAI,EAAE,QAAQ,CAAC,GAAG,EAClB,SAAS,EAAE,gBAAgB,EAC3B,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,OAAO;QAEnB,8BAAM,SAAS,EAAC,wCAAwC,IAAE,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAQ;QAC7F,8BAAM,SAAS,EAAC,wCAAwC,IAAE,QAAQ,CAAQ;QACzE,aAAa,IAAI,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAChE,CACT,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchResultsDropdownList.d.ts","sourceRoot":"","sources":["../src/SearchResultsDropdownList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAIhE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"SearchResultsDropdownList.d.ts","sourceRoot":"","sources":["../src/SearchResultsDropdownList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAIhE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKtC;;;GAGG;AACH,KAAK,8BAA8B,GAAG;IAClC;;OAEG;IACH,aAAa,EAAE,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;IACrD;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE,yBAAyB,KAAK,IAAI,CAAC;CACvD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,8BAA8B,CA8B9E,CAAC"}
|
|
@@ -4,6 +4,7 @@ import { DropdownList } from "@gooddata/sdk-ui-kit";
|
|
|
4
4
|
import { ResultsItem } from "./ResultsItem.js";
|
|
5
5
|
import { useListSelector } from "./hooks/index.js";
|
|
6
6
|
const ITEM_HEIGHT = 50;
|
|
7
|
+
const MAX_ITEMS_UNSCROLLED = 5;
|
|
7
8
|
/**
|
|
8
9
|
* A dropdown list with the search results.
|
|
9
10
|
* @internal
|
|
@@ -11,7 +12,7 @@ const ITEM_HEIGHT = 50;
|
|
|
11
12
|
export const SearchResultsDropdownList = ({ searchResults, searchLoading, isMobile, width, onSelect, }) => {
|
|
12
13
|
const onListItemSelect = (item) => onSelect(item.item);
|
|
13
14
|
const [active, setActive] = useListSelector(searchResults, onListItemSelect);
|
|
14
|
-
return (React.createElement(DropdownList, { width: width, isMobile: isMobile, isLoading: searchLoading, itemHeight: ITEM_HEIGHT, renderItem: ({ item }) => {
|
|
15
|
+
return (React.createElement(DropdownList, { width: width, height: ITEM_HEIGHT * Math.min(searchResults.length, MAX_ITEMS_UNSCROLLED), isMobile: isMobile, isLoading: searchLoading, itemHeight: ITEM_HEIGHT, renderItem: ({ item }) => {
|
|
15
16
|
return (React.createElement(ResultsItem, { listItem: item, isActive: active === item, setActive: setActive, onSelect: onListItemSelect }));
|
|
16
17
|
}, items: searchResults }));
|
|
17
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchResultsDropdownList.js","sourceRoot":"","sources":["../src/SearchResultsDropdownList.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,MAAM,WAAW,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"SearchResultsDropdownList.js","sourceRoot":"","sources":["../src/SearchResultsDropdownList.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,oBAAoB,GAAG,CAAC,CAAC;AA6B/B;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAA6C,CAAC,EAChF,aAAa,EACb,aAAa,EACb,QAAQ,EACR,KAAK,EACL,QAAQ,GACX,EAAE,EAAE;IACD,MAAM,gBAAgB,GAAG,CAAC,IAAyC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5F,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,eAAe,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IAE7E,OAAO,CACH,oBAAC,YAAY,IACT,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAC1E,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YACrB,OAAO,CACH,oBAAC,WAAW,IACR,QAAQ,EAAE,IAAI,EACd,QAAQ,EAAE,MAAM,KAAK,IAAI,EACzB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,gBAAgB,GAC5B,CACL,CAAC;QACN,CAAC,EACD,KAAK,EAAE,aAAa,GACtB,CACL,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;AAE/B,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAIzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"SemanticSearch.d.ts","sourceRoot":"","sources":["../src/SemanticSearch.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAIzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAI/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,uBAAuB,EAAE,CAAC;IACxC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AA2GF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAMxD,CAAC"}
|
package/esm/SemanticSearch.js
CHANGED
|
@@ -3,9 +3,8 @@ import * as React from "react";
|
|
|
3
3
|
import { useDebouncedState, Input, Dropdown } from "@gooddata/sdk-ui-kit";
|
|
4
4
|
import { IntlWrapper } from "@gooddata/sdk-ui";
|
|
5
5
|
import { SearchResultsDropdownList } from "./SearchResultsDropdownList.js";
|
|
6
|
-
import { useSemanticSearch } from "./hooks/index.js";
|
|
6
|
+
import { useSemanticSearch, useElementWidth } from "./hooks/index.js";
|
|
7
7
|
import classnames from "classnames";
|
|
8
|
-
import { useElementWidth } from "./hooks/useElementWidth.js";
|
|
9
8
|
/**
|
|
10
9
|
* Search input debounce time.
|
|
11
10
|
* I.e. how long to wait after the user stops typing before sending the search request.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SemanticSearch.js","sourceRoot":"","sources":["../src/SemanticSearch.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"SemanticSearch.js","sourceRoot":"","sources":["../src/SemanticSearch.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { GenAISemanticSearchType, ISemanticSearchResultItem } from "@gooddata/sdk-model";
|
|
2
|
+
/**
|
|
3
|
+
* A conclusion of a single search action by the user.
|
|
4
|
+
* Used to collect usage metrics.
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
export type ISearchMetrics = {
|
|
8
|
+
/**
|
|
9
|
+
* The last search term.
|
|
10
|
+
*/
|
|
11
|
+
lastSearchTerm: string;
|
|
12
|
+
/**
|
|
13
|
+
* Number of times the search feed was triggered.
|
|
14
|
+
*/
|
|
15
|
+
searchCount: number;
|
|
16
|
+
/**
|
|
17
|
+
* A title of the selected item, if any.
|
|
18
|
+
* Null means the search was closed without selecting an item.
|
|
19
|
+
*/
|
|
20
|
+
selectedItemTitle: string | null;
|
|
21
|
+
/**
|
|
22
|
+
* The type of the selected item, if any.
|
|
23
|
+
* Null means the search was closed without selecting an item.
|
|
24
|
+
*/
|
|
25
|
+
selectedItemType: GenAISemanticSearchType | null;
|
|
26
|
+
};
|
|
27
|
+
export type UseSearchMetricsCallback = (metricsData: ISearchMetrics) => void;
|
|
28
|
+
export type UseSearchMetricsReturn = {
|
|
29
|
+
onCloseMetrics: () => void;
|
|
30
|
+
onSelectMetrics: (item: ISemanticSearchResultItem) => void;
|
|
31
|
+
onSearchMetrics: (searchTerm: string) => void;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* A hook that helps to collect usage metrics for the search overlay.
|
|
35
|
+
* Reporting is done on a search transaction, i.e.:
|
|
36
|
+
* - open + close (= report transaction)
|
|
37
|
+
* - open + type + close (= report transaction)
|
|
38
|
+
* - open + type + select (= report transaction)
|
|
39
|
+
* - open + type + select (= report transaction) + type + close (= report transaction)
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
export declare const useSearchMetrics: (callback?: UseSearchMetricsCallback) => UseSearchMetricsReturn;
|
|
43
|
+
//# sourceMappingURL=useSearchMetrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSearchMetrics.d.ts","sourceRoot":"","sources":["../../src/hooks/useSearchMetrics.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEzF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IACzB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,gBAAgB,EAAE,uBAAuB,GAAG,IAAI,CAAC;CACpD,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,KAAK,IAAI,CAAC;IAC3D,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD,CAAC;AAiBF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,cAAe,wBAAwB,KAAG,sBA+DtE,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// (C) 2024 GoodData Corporation
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
const defaultOnSearchMetrics = {
|
|
4
|
+
state: {
|
|
5
|
+
lastSearchTerm: "",
|
|
6
|
+
searchCount: 0,
|
|
7
|
+
selectedItemTitle: null,
|
|
8
|
+
selectedItemType: null,
|
|
9
|
+
},
|
|
10
|
+
reported: false,
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* A hook that helps to collect usage metrics for the search overlay.
|
|
14
|
+
* Reporting is done on a search transaction, i.e.:
|
|
15
|
+
* - open + close (= report transaction)
|
|
16
|
+
* - open + type + close (= report transaction)
|
|
17
|
+
* - open + type + select (= report transaction)
|
|
18
|
+
* - open + type + select (= report transaction) + type + close (= report transaction)
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
export const useSearchMetrics = (callback) => {
|
|
22
|
+
// Use ref because we don't want to cause redraw with the new metrics data
|
|
23
|
+
const searchMetricsRef = React.useRef(defaultOnSearchMetrics);
|
|
24
|
+
// Callback will be called when the search is closed
|
|
25
|
+
const onCloseMetrics = React.useCallback(() => {
|
|
26
|
+
// Do not report the metrics if it was already reported
|
|
27
|
+
// i.e. by onSelect callback
|
|
28
|
+
if (searchMetricsRef.current.reported)
|
|
29
|
+
return;
|
|
30
|
+
// Calling callback with null values
|
|
31
|
+
callback?.({
|
|
32
|
+
...searchMetricsRef.current.state,
|
|
33
|
+
selectedItemTitle: null,
|
|
34
|
+
selectedItemType: null,
|
|
35
|
+
});
|
|
36
|
+
// Flush the metrics data
|
|
37
|
+
searchMetricsRef.current = defaultOnSearchMetrics;
|
|
38
|
+
}, [callback]);
|
|
39
|
+
// Callback will be called when the user selects an item
|
|
40
|
+
const onSelectMetrics = React.useCallback((item) => {
|
|
41
|
+
// Report the metrics
|
|
42
|
+
callback?.({
|
|
43
|
+
...searchMetricsRef.current.state,
|
|
44
|
+
selectedItemTitle: item.title,
|
|
45
|
+
selectedItemType: item.type,
|
|
46
|
+
});
|
|
47
|
+
// Mark the metrics as reported
|
|
48
|
+
// Do not flush the metric data, because user might select several items in sequence
|
|
49
|
+
// e.g. when cmd+click and open it in a new tab
|
|
50
|
+
searchMetricsRef.current.reported = true;
|
|
51
|
+
}, [callback]);
|
|
52
|
+
// Callback will be called when the user types in the search input
|
|
53
|
+
const onSearchMetrics = React.useCallback((searchTerm) => {
|
|
54
|
+
const { searchCount, lastSearchTerm } = searchMetricsRef.current.state;
|
|
55
|
+
// We do not want to count the case when the user continues to type the same search term
|
|
56
|
+
const shouldIncrement = !(lastSearchTerm === ""
|
|
57
|
+
? searchTerm === ""
|
|
58
|
+
: searchTerm.startsWith(lastSearchTerm));
|
|
59
|
+
// Also reset reported flag to catch type -> select -> type -> close sequence
|
|
60
|
+
searchMetricsRef.current = {
|
|
61
|
+
state: {
|
|
62
|
+
...searchMetricsRef.current.state,
|
|
63
|
+
lastSearchTerm: searchTerm,
|
|
64
|
+
searchCount: shouldIncrement ? searchCount + 1 : searchCount,
|
|
65
|
+
},
|
|
66
|
+
reported: false,
|
|
67
|
+
};
|
|
68
|
+
}, []);
|
|
69
|
+
return {
|
|
70
|
+
onCloseMetrics,
|
|
71
|
+
onSelectMetrics,
|
|
72
|
+
onSearchMetrics,
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=useSearchMetrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSearchMetrics.js","sourceRoot":"","sources":["../../src/hooks/useSearchMetrics.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA0C/B,MAAM,sBAAsB,GAAsB;IAC9C,KAAK,EAAE;QACH,cAAc,EAAE,EAAE;QAClB,WAAW,EAAE,CAAC;QACd,iBAAiB,EAAE,IAAI;QACvB,gBAAgB,EAAE,IAAI;KACzB;IACD,QAAQ,EAAE,KAAK;CAClB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAmC,EAA0B,EAAE;IAC5F,0EAA0E;IAC1E,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAoB,sBAAsB,CAAC,CAAC;IAEjF,oDAAoD;IACpD,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAC1C,uDAAuD;QACvD,4BAA4B;QAC5B,IAAI,gBAAgB,CAAC,OAAO,CAAC,QAAQ;YAAE,OAAO;QAE9C,oCAAoC;QACpC,QAAQ,EAAE,CAAC;YACP,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK;YACjC,iBAAiB,EAAE,IAAI;YACvB,gBAAgB,EAAE,IAAI;SACzB,CAAC,CAAC;QAEH,yBAAyB;QACzB,gBAAgB,CAAC,OAAO,GAAG,sBAAsB,CAAC;IACtD,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,wDAAwD;IACxD,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CACrC,CAAC,IAA+B,EAAE,EAAE;QAChC,qBAAqB;QACrB,QAAQ,EAAE,CAAC;YACP,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK;YACjC,iBAAiB,EAAE,IAAI,CAAC,KAAK;YAC7B,gBAAgB,EAAE,IAAI,CAAC,IAAI;SAC9B,CAAC,CAAC;QACH,+BAA+B;QAC/B,oFAAoF;QACpF,+CAA+C;QAC/C,gBAAgB,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC7C,CAAC,EACD,CAAC,QAAQ,CAAC,CACb,CAAC;IAEF,kEAAkE;IAClE,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,UAAkB,EAAE,EAAE;QAC7D,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC;QAEvE,wFAAwF;QACxF,MAAM,eAAe,GAAG,CAAC,CAAC,cAAc,KAAK,EAAE;YAC3C,CAAC,CAAC,UAAU,KAAK,EAAE;YACnB,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;QAE7C,6EAA6E;QAC7E,gBAAgB,CAAC,OAAO,GAAG;YACvB,KAAK,EAAE;gBACH,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK;gBACjC,cAAc,EAAE,UAAU;gBAC1B,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW;aAC/D;YACD,QAAQ,EAAE,KAAK;SAClB,CAAC;IACN,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACH,cAAc;QACd,eAAe;QACf,eAAe;KAClB,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { ISemanticSearchResultItem } from "@gooddata/sdk-model";
|
|
3
3
|
import { ListItemProps } from "../types.js";
|
|
4
|
+
/**
|
|
5
|
+
* A single result item in the search results.
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
4
8
|
export declare const AnnotatedResultsItem: React.NamedExoticComponent<ListItemProps<ISemanticSearchResultItem>>;
|
|
5
9
|
//# sourceMappingURL=AnnotatedResultsItem.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnotatedResultsItem.d.ts","sourceRoot":"","sources":["../../src/internal/AnnotatedResultsItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"AnnotatedResultsItem.d.ts","sourceRoot":"","sources":["../../src/internal/AnnotatedResultsItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAiC5C;;;GAGG;AACH,eAAO,MAAM,oBAAoB,sEAAuC,CAAC"}
|
|
@@ -1,33 +1,25 @@
|
|
|
1
1
|
// (C) 2024 GoodData Corporation
|
|
2
2
|
import * as React from "react";
|
|
3
|
-
import { useTheme } from "@gooddata/sdk-ui-theme-provider";
|
|
4
|
-
import classnames from "classnames";
|
|
5
3
|
import { renderDetails } from "../utils/renderDetails.js";
|
|
6
4
|
import { renderItemIcon } from "../utils/renderItemIcon.js";
|
|
7
5
|
import { UpdatedDate } from "./UpdateDate.js";
|
|
8
|
-
import { renderLock } from "../utils/
|
|
6
|
+
import { renderLock } from "../utils/renderLock.js";
|
|
7
|
+
import { SearchListItem } from "../SearchListItem.js";
|
|
8
|
+
const CoreAnnotatedResultsItem = (props) => {
|
|
9
|
+
const { listItem } = props;
|
|
10
|
+
const lockIcon = renderLock(listItem);
|
|
11
|
+
return (React.createElement(SearchListItem, { ...props, renderIcon: renderItemIcon, renderDetails: renderDetails },
|
|
12
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text__row" },
|
|
13
|
+
lockIcon,
|
|
14
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text__ellipsis" }, listItem.item.title)),
|
|
15
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text__row" },
|
|
16
|
+
listItem.parentRef ? (React.createElement("span", { className: "gd-semantic-search__results-item__text__ellipsis" }, listItem.parentRef.sourceObjectTitle)) : null,
|
|
17
|
+
React.createElement("span", null,
|
|
18
|
+
React.createElement(UpdatedDate, { listItem: listItem })))));
|
|
19
|
+
};
|
|
9
20
|
/**
|
|
10
21
|
* A single result item in the search results.
|
|
11
22
|
* @internal
|
|
12
23
|
*/
|
|
13
|
-
const CoreAnnotatedResultsItem = ({ listItem, isActive, setActive, onSelect, }) => {
|
|
14
|
-
const theme = useTheme();
|
|
15
|
-
const Tag = listItem.url ? "a" : "span";
|
|
16
|
-
// Use mouse enter with the target check instead of hover to prevent multiple triggers
|
|
17
|
-
return (React.createElement(Tag, { href: listItem.url, className: classnames({
|
|
18
|
-
"gd-semantic-search__results-item": true,
|
|
19
|
-
"gd-semantic-search__results-item--active": isActive,
|
|
20
|
-
}), onPointerOver: () => setActive(listItem), onClick: (e) => onSelect(listItem, e.nativeEvent) },
|
|
21
|
-
React.createElement("span", { className: "gd-semantic-search__results-item__icon" }, renderItemIcon(listItem, { color: theme?.palette?.complementary?.c5 ?? "#B0BECA" })),
|
|
22
|
-
React.createElement("span", { className: "gd-semantic-search__results-item__text gd-semantic-search__results-item__text--result" },
|
|
23
|
-
React.createElement("span", { className: "gd-semantic-search__results-item__text__1" },
|
|
24
|
-
renderLock(listItem),
|
|
25
|
-
listItem.item.title),
|
|
26
|
-
React.createElement("span", { className: "gd-semantic-search__results-item__text__2" },
|
|
27
|
-
listItem.parentRef ? (React.createElement("span", { className: "gd-semantic-search__results-item__annotation" }, listItem.parentRef.sourceObjectTitle)) : null,
|
|
28
|
-
React.createElement("span", { className: "gd-semantic-search__results-item__annotation" },
|
|
29
|
-
React.createElement(UpdatedDate, { listItem: listItem })))),
|
|
30
|
-
isActive ? renderDetails(listItem, theme) : null));
|
|
31
|
-
};
|
|
32
24
|
export const AnnotatedResultsItem = React.memo(CoreAnnotatedResultsItem);
|
|
33
25
|
//# sourceMappingURL=AnnotatedResultsItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnotatedResultsItem.js","sourceRoot":"","sources":["../../src/internal/AnnotatedResultsItem.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AnnotatedResultsItem.js","sourceRoot":"","sources":["../../src/internal/AnnotatedResultsItem.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,wBAAwB,GAAuD,CAAC,KAAK,EAAE,EAAE;IAC3F,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC3B,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEtC,OAAO,CACH,oBAAC,cAAc,OAAK,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa;QAC/E,8BAAM,SAAS,EAAC,6CAA6C;YACxD,QAAQ;YACT,8BAAM,SAAS,EAAC,kDAAkD,IAC7D,QAAQ,CAAC,IAAI,CAAC,KAAK,CACjB,CACJ;QACP,8BAAM,SAAS,EAAC,6CAA6C;YACxD,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAClB,8BAAM,SAAS,EAAC,kDAAkD,IAC7D,QAAQ,CAAC,SAAS,CAAC,iBAAiB,CAClC,CACV,CAAC,CAAC,CAAC,IAAI;YACR;gBACI,oBAAC,WAAW,IAAC,QAAQ,EAAE,QAAQ,GAAI,CAChC,CACJ,CACM,CACpB,CAAC;AACN,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistoryItem.d.ts","sourceRoot":"","sources":["../../src/internal/HistoryItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"HistoryItem.d.ts","sourceRoot":"","sources":["../../src/internal/HistoryItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ5C;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAcvD,CAAC"}
|
|
@@ -1,21 +1,15 @@
|
|
|
1
1
|
// (C) 2024 GoodData Corporation
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { Icon } from "@gooddata/sdk-ui-kit";
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import { SearchListItem } from "../SearchListItem.js";
|
|
5
|
+
const renderIcon = (_, theme) => (React.createElement(Icon.HistoryBack, { color: theme?.palette?.complementary?.c5 ?? "#B0BECA" }));
|
|
6
6
|
/**
|
|
7
|
-
* A single
|
|
7
|
+
* A single history item.
|
|
8
8
|
* @internal
|
|
9
9
|
*/
|
|
10
|
-
export const HistoryItem = (
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"gd-semantic-search__results-item": true,
|
|
15
|
-
"gd-semantic-search__results-item--active": isActive,
|
|
16
|
-
}), onPointerOver: () => setActive(listItem), onClick: (e) => onSelect(listItem, e.nativeEvent) },
|
|
17
|
-
React.createElement("span", { className: "gd-semantic-search__results-item__icon gd-semantic-search__results-item__icon--history" },
|
|
18
|
-
React.createElement(Icon.HistoryBack, { color: theme?.palette?.complementary?.c5 ?? "#B0BECA" })),
|
|
19
|
-
React.createElement("span", { className: "gd-semantic-search__results-item__text gd-semantic-search__results-item__text--history" }, listItem.item)));
|
|
10
|
+
export const HistoryItem = (props) => {
|
|
11
|
+
return (React.createElement(SearchListItem, { ...props, renderIcon: renderIcon, className: "gd-semantic-search__results-item--history" },
|
|
12
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text__row" },
|
|
13
|
+
React.createElement("span", { className: "gd-semantic-search__results-item__text__ellipsis" }, props.listItem.item))));
|
|
20
14
|
};
|
|
21
15
|
//# sourceMappingURL=HistoryItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistoryItem.js","sourceRoot":"","sources":["../../src/internal/HistoryItem.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"HistoryItem.js","sourceRoot":"","sources":["../../src/internal/HistoryItem.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,MAAM,UAAU,GAAG,CAAC,CAAM,EAAE,KAAc,EAAE,EAAE,CAAC,CAC3C,oBAAC,IAAI,CAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,SAAS,GAAI,CAC9E,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAoC,CAAC,KAAK,EAAE,EAAE;IAClE,OAAO,CACH,oBAAC,cAAc,OACP,KAAK,EACT,UAAU,EAAE,UAAU,EACtB,SAAS,EAAC,2CAA2C;QAErD,8BAAM,SAAS,EAAC,6CAA6C;YACzD,8BAAM,SAAS,EAAC,kDAAkD,IAC7D,KAAK,CAAC,QAAQ,CAAC,IAAI,CACjB,CACJ,CACM,CACpB,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchList.d.ts","sourceRoot":"","sources":["../../src/internal/SearchList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"SearchList.d.ts","sourceRoot":"","sources":["../../src/internal/SearchList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKtD;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC7B;;OAEG;IACH,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,GAAG,aAAa,KAAK,IAAI,CAAC;IACrE;;OAEG;IACH,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;CACxD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,yFAqBtB,CAAC"}
|
|
@@ -3,13 +3,14 @@ import * as React from "react";
|
|
|
3
3
|
import { List } from "@gooddata/sdk-ui-kit";
|
|
4
4
|
import { useListSelector } from "../hooks/index.js";
|
|
5
5
|
const ITEM_HEIGHT = 50;
|
|
6
|
+
const MAX_ITEMS_UNSCROLLED = 10;
|
|
6
7
|
/**
|
|
7
8
|
* A dropdown list with the search results.
|
|
8
9
|
* @internal
|
|
9
10
|
*/
|
|
10
11
|
export const SearchList = ({ items, width, onSelect, ItemComponent }) => {
|
|
11
12
|
const [selected, setSelected] = useListSelector(items, onSelect);
|
|
12
|
-
return (React.createElement(List, { width: width, height: ITEM_HEIGHT * items.length, itemHeight: ITEM_HEIGHT, renderItem: ({ item }) => {
|
|
13
|
+
return (React.createElement(List, { width: width, height: ITEM_HEIGHT * Math.min(items.length, MAX_ITEMS_UNSCROLLED), itemHeight: ITEM_HEIGHT, renderItem: ({ item }) => {
|
|
13
14
|
return (React.createElement(ItemComponent, { listItem: item, isActive: item === selected, setActive: setSelected, onSelect: onSelect }));
|
|
14
15
|
}, items: items }));
|
|
15
16
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchList.js","sourceRoot":"","sources":["../../src/internal/SearchList.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,MAAM,WAAW,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"SearchList.js","sourceRoot":"","sources":["../../src/internal/SearchList.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAyBhC;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAsB,EAAE,EAAE;IAC5F,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEjE,OAAO,CACH,oBAAC,IAAI,IACD,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAClE,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YACrB,OAAO,CACH,oBAAC,aAAa,IACV,QAAQ,EAAE,IAAI,EACd,QAAQ,EAAE,IAAI,KAAK,QAAQ,EAC3B,SAAS,EAAE,WAAW,EACtB,QAAQ,EAAE,QAAQ,GACpB,CACL,CAAC;QACN,CAAC,EACD,KAAK,EAAE,KAAK,GACd,CACL,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -1,16 +1,25 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import { WrappedComponentProps } from "react-intl";
|
|
3
2
|
import { GenAISemanticSearchType, ISemanticSearchResultItem } from "@gooddata/sdk-model";
|
|
4
3
|
import { IAnalyticalBackend } from "@gooddata/sdk-backend-spi";
|
|
4
|
+
export type SearchOnSelect = {
|
|
5
|
+
item: ISemanticSearchResultItem;
|
|
6
|
+
preventDefault: () => void;
|
|
7
|
+
itemUrl?: string;
|
|
8
|
+
newTab?: boolean;
|
|
9
|
+
};
|
|
5
10
|
/**
|
|
6
11
|
* Props for the SemanticSearchOverlay component.
|
|
7
12
|
* @internal
|
|
8
13
|
*/
|
|
9
|
-
export type SearchOverlayProps =
|
|
14
|
+
export type SearchOverlayProps = {
|
|
10
15
|
/**
|
|
11
16
|
* A function called when the user selects an item from the search results.
|
|
12
17
|
*/
|
|
13
|
-
onSelect: (
|
|
18
|
+
onSelect: (selection: SearchOnSelect) => void;
|
|
19
|
+
/**
|
|
20
|
+
* A function called when the search request is triggered.
|
|
21
|
+
*/
|
|
22
|
+
onSearch?: (query: string) => void;
|
|
14
23
|
/**
|
|
15
24
|
* An analytical backend to use for the search. Can be omitted and taken from context.
|
|
16
25
|
*/
|
|
@@ -31,10 +40,22 @@ export type SearchOverlayProps = WrappedComponentProps & {
|
|
|
31
40
|
* A limit of search results to return.
|
|
32
41
|
*/
|
|
33
42
|
limit?: number;
|
|
43
|
+
/**
|
|
44
|
+
* A minimum similarity score for search result to be shown to user.
|
|
45
|
+
*/
|
|
46
|
+
threshold?: number;
|
|
34
47
|
/**
|
|
35
48
|
* Additional CSS class for the component.
|
|
36
49
|
*/
|
|
37
50
|
className?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Locale to use for translations.
|
|
53
|
+
*/
|
|
54
|
+
locale?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Timezone in which metadata created and updated dates are saved.
|
|
57
|
+
*/
|
|
58
|
+
metadataTimezone?: string;
|
|
38
59
|
};
|
|
39
60
|
/**
|
|
40
61
|
* A component that allows users to search for insights, metrics, attributes, and other objects using semantic search.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchOverlay.d.ts","sourceRoot":"","sources":["../../src/internal/SearchOverlay.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"SearchOverlay.d.ts","sourceRoot":"","sources":["../../src/internal/SearchOverlay.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAwC/D,MAAM,MAAM,cAAc,GAAG;IACzB,IAAI,EAAE,yBAAyB,CAAC;IAChC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC7B;;OAEG;IACH,QAAQ,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;IAC9C;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC;;OAEG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,WAAW,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACxC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AA+MF;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAQtD,CAAC"}
|