@gooddata/sdk-ui-kit 11.52.0-alpha.3 → 11.52.0-alpha.5
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/@ui/UiAsyncTable/UiAsyncTable/UiAsyncTableBody.d.ts.map +1 -1
- package/esm/@ui/UiAsyncTable/UiAsyncTable/UiAsyncTableBody.js +9 -6
- package/esm/@ui/UiAsyncTable/UiAsyncTable/UiAsyncTableRow.d.ts.map +1 -1
- package/esm/@ui/UiAsyncTable/UiAsyncTable/UiAsyncTableRow.js +13 -2
- package/esm/@ui/UiAsyncTable/UiAsyncTable/asyncTableGridContext.d.ts +4 -0
- package/esm/@ui/UiAsyncTable/UiAsyncTable/asyncTableGridContext.d.ts.map +1 -0
- package/esm/@ui/UiAsyncTable/UiAsyncTable/asyncTableGridContext.js +12 -0
- package/esm/@ui/UiButton/UiButton.d.ts.map +1 -1
- package/esm/@ui/UiButton/UiButton.js +1 -1
- package/esm/Dialog/StylingEditorDialog/StylingEditorDialog.d.ts +9 -0
- package/esm/Dialog/StylingEditorDialog/StylingEditorDialog.d.ts.map +1 -1
- package/esm/Dialog/StylingEditorDialog/StylingEditorDialog.js +33 -28
- package/esm/Dropdown/DropdownButton.d.ts.map +1 -1
- package/esm/Dropdown/DropdownButton.js +5 -0
- package/esm/Dropdown/DropdownList.d.ts.map +1 -1
- package/esm/Dropdown/DropdownList.js +5 -2
- package/esm/Header/Header.d.ts.map +1 -1
- package/esm/Header/Header.js +2 -2
- package/esm/Header/HeaderChatButton.d.ts +9 -1
- package/esm/Header/HeaderChatButton.d.ts.map +1 -1
- package/esm/Header/HeaderChatButton.js +12 -1
- package/esm/Header/HeaderDataMenu.d.ts +1 -5
- package/esm/Header/HeaderDataMenu.d.ts.map +1 -1
- package/esm/Header/HeaderDataMenu.js +6 -6
- package/esm/Header/HeaderHelp.d.ts +1 -5
- package/esm/Header/HeaderHelp.d.ts.map +1 -1
- package/esm/Header/HeaderHelp.js +4 -4
- package/esm/Header/HeaderWorkspacePicker.d.ts +1 -5
- package/esm/Header/HeaderWorkspacePicker.d.ts.map +1 -1
- package/esm/Header/HeaderWorkspacePicker.js +6 -6
- package/esm/Header/HeaderWorkspacePickerItem.d.ts +1 -5
- package/esm/Header/HeaderWorkspacePickerItem.d.ts.map +1 -1
- package/esm/Header/HeaderWorkspacePickerItem.js +3 -3
- package/esm/Header/typings.d.ts +5 -0
- package/esm/Header/typings.d.ts.map +1 -1
- package/esm/Header/typings.js +1 -1
- package/esm/List/LegacyInvertableList.d.ts.map +1 -1
- package/esm/List/LegacyInvertableList.js +2 -2
- package/esm/Timepicker/Timepicker.d.ts +2 -3
- package/esm/Timepicker/Timepicker.d.ts.map +1 -1
- package/esm/Timepicker/Timepicker.js +4 -4
- package/esm/Timezone/TimezoneSelect.d.ts +10 -2
- package/esm/Timezone/TimezoneSelect.d.ts.map +1 -1
- package/esm/Timezone/TimezoneSelect.js +4 -3
- package/esm/index.d.ts +1 -1
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -1
- package/esm/sdk-ui-kit.d.ts +33 -9
- package/package.json +11 -11
- package/src/@ui/UiButton/UiButton.scss +5 -1
- package/styles/css/main.css +7 -1
- package/styles/css/main.css.map +1 -1
- package/styles/css/stylingEditorDialog.css +3 -0
- package/styles/css/stylingEditorDialog.css.map +1 -1
- package/styles/scss/stylingEditorDialog.scss +4 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UiAsyncTableBody.d.ts","sourceRoot":"","sources":["../../../../src/@ui/UiAsyncTable/UiAsyncTable/UiAsyncTableBody.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"UiAsyncTableBody.d.ts","sourceRoot":"","sources":["../../../../src/@ui/UiAsyncTable/UiAsyncTable/UiAsyncTableBody.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAM1D,wBAAgB,gBAAgB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,EACzE,KAAK,EACL,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,SAAS,EACT,WAAW,EACX,YAAY,EACZ,OAAO,EACP,WAAW,EACX,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,UAAU,EACb,EAAE,sBAAsB,CAAC,CAAC,CAAC,2CAyD3B"}
|
|
@@ -4,10 +4,12 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
|
4
4
|
import { isEnterKey } from "../../../utils/events.js";
|
|
5
5
|
import { makeGridKeyboardNavigation } from "../../@utils/keyboardNavigation.js";
|
|
6
6
|
import { UiPagedVirtualList } from "../../UiPagedVirtualList/UiPagedVirtualList.js";
|
|
7
|
+
import { AsyncTableGridRefProvider } from "./asyncTableGridContext.js";
|
|
7
8
|
import { useSkeletonItem } from "./SkeletonItemFactory.js";
|
|
8
9
|
import { getCellId, getItemKey, getRowId } from "./utils.js";
|
|
9
10
|
export function UiAsyncTableBody({ items, maxHeight, itemHeight, skeletonItemsCount, hasNextPage, isLoading, onItemClick, loadNextPage, columns, bulkActions, scrollToIndex, isLargeRow, shouldLoadNextPage, renderItem, }) {
|
|
10
11
|
const SkeletonItem = useSkeletonItem(columns, bulkActions, isLargeRow ?? false);
|
|
12
|
+
const gridRef = useRef(null);
|
|
11
13
|
const { handleKeyDown, handleFocus, focusedRowIndex, focusedColumnIndex, focusedItemRef } = useAsyncTableBodyKeyboardNavigation(items.length, columns.length, !!bulkActions, scrollToIndex);
|
|
12
14
|
const activeDescendantId = useMemo(() => {
|
|
13
15
|
if (focusedRowIndex === undefined || focusedRowIndex < 0 || focusedRowIndex >= items.length) {
|
|
@@ -19,12 +21,13 @@ export function UiAsyncTableBody({ items, maxHeight, itemHeight, skeletonItemsCo
|
|
|
19
21
|
}
|
|
20
22
|
return getRowId(itemId);
|
|
21
23
|
}, [focusedRowIndex, focusedColumnIndex, items]);
|
|
22
|
-
return (_jsx(UiPagedVirtualList, { maxHeight: maxHeight, itemHeight: itemHeight, itemsGap: 0, itemPadding: 0, items: items, skeletonItemsCount: skeletonItemsCount, hasNextPage: hasNextPage, isLoading: isLoading, onKeyDownSelect: onItemClick, loadNextPage: loadNextPage, SkeletonItem: SkeletonItem, scrollbarHoverEffect: true, scrollToIndex: scrollToIndex ?? focusedRowIndex, shouldLoadNextPage: shouldLoadNextPage, tabIndex: items.length ? 0 : -1, customKeyboardNavigationHandler: handleKeyDown, onFocus: handleFocus, listboxProps: {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
return (_jsx(AsyncTableGridRefProvider, { value: gridRef, children: _jsx(UiPagedVirtualList, { maxHeight: maxHeight, itemHeight: itemHeight, itemsGap: 0, itemPadding: 0, items: items, skeletonItemsCount: skeletonItemsCount, hasNextPage: hasNextPage, isLoading: isLoading, onKeyDownSelect: onItemClick, loadNextPage: loadNextPage, SkeletonItem: SkeletonItem, scrollbarHoverEffect: true, scrollToIndex: scrollToIndex ?? focusedRowIndex, shouldLoadNextPage: shouldLoadNextPage, tabIndex: items.length ? 0 : -1, customKeyboardNavigationHandler: handleKeyDown, onFocus: handleFocus, listboxProps: {
|
|
25
|
+
"aria-activedescendant": activeDescendantId,
|
|
26
|
+
ref: gridRef,
|
|
27
|
+
}, children: (item, focusedIndex) => {
|
|
28
|
+
const itemIndex = focusedIndex ?? 0;
|
|
29
|
+
return renderItem(item, itemIndex, focusedItemRef, itemIndex === focusedRowIndex, focusedColumnIndex);
|
|
30
|
+
} }) }));
|
|
28
31
|
}
|
|
29
32
|
const useAsyncTableBodyKeyboardNavigation = (rowsLength, definedColumnsLength, hasBulkActions, scrollToIndex) => {
|
|
30
33
|
const [focusedRowIndex, setFocusedRowIndex] = useState(undefined);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UiAsyncTableRow.d.ts","sourceRoot":"","sources":["../../../../src/@ui/UiAsyncTable/UiAsyncTable/UiAsyncTableRow.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,EAGH,KAAK,qBAAqB,EAE7B,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"UiAsyncTableRow.d.ts","sourceRoot":"","sources":["../../../../src/@ui/UiAsyncTable/UiAsyncTable/UiAsyncTableRow.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,EAGH,KAAK,qBAAqB,EAE7B,MAAM,aAAa,CAAC;AAQrB,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,EACxE,IAAI,EACJ,SAAS,EACT,OAAO,EACP,QAAQ,EACR,OAAO,EACP,UAAU,EACV,WAAW,EACX,OAAO,EACP,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACtB,EAAE,qBAAqB,CAAC,CAAC,CAAC,2CA4E1B"}
|
|
@@ -4,6 +4,7 @@ import { useCallback } from "react";
|
|
|
4
4
|
import { Dropdown } from "../../../Dropdown/Dropdown.js";
|
|
5
5
|
import { UiIconButton } from "../../UiIconButton/UiIconButton.js";
|
|
6
6
|
import { e } from "../asyncTableBem.js";
|
|
7
|
+
import { useAsyncTableGridRef } from "./asyncTableGridContext.js";
|
|
7
8
|
import { UiAsyncTableCheckbox } from "./UiAsyncTableCheckbox.js";
|
|
8
9
|
import { UiAsyncTableIconRenderer } from "./UiAsyncTableIconRenderer.js";
|
|
9
10
|
import { getCellId, getColumnWidth, getItemKey, getRowId, getRowLabelId } from "./utils.js";
|
|
@@ -43,6 +44,16 @@ export function UiAsyncTableRow({ item, itemIndex, columns, onSelect, onClick, i
|
|
|
43
44
|
})] }));
|
|
44
45
|
}
|
|
45
46
|
const useRenderCellContent = ({ isLarge, }) => {
|
|
47
|
+
const gridRef = useAsyncTableGridRef();
|
|
48
|
+
// Put focus back on the grid before the menu closes. Callers routinely close the menu and open a
|
|
49
|
+
// dialog in the same tick (flushSync(closeDropdown) then setState); that dialog captures whatever is
|
|
50
|
+
// focused as its own return target, and the dropdown's restore is deferred to a microtask, so it would
|
|
51
|
+
// land after the snapshot was taken and the dialog would return focus to <body> - i.e. the page top.
|
|
52
|
+
// Restoring here keeps it synchronous, and the deferred restore then correctly sees nothing to do.
|
|
53
|
+
const closeMenuAndRestoreFocus = useCallback((closeDropdown) => {
|
|
54
|
+
gridRef?.current?.focus();
|
|
55
|
+
closeDropdown();
|
|
56
|
+
}, [gridRef]);
|
|
46
57
|
const renderRoleIconWithWrapper = useCallback((renderRoleIcon, item) => {
|
|
47
58
|
return (_jsx(UiAsyncTableIconRenderer, { renderIcon: renderRoleIcon, className: e("role-icon"), item: item }));
|
|
48
59
|
}, []);
|
|
@@ -64,8 +75,8 @@ const useRenderCellContent = ({ isLarge, }) => {
|
|
|
64
75
|
ariaExpanded: isOpen,
|
|
65
76
|
ariaLabel: label,
|
|
66
77
|
}, ref: isCellFocused ? focusedElementRef : undefined }));
|
|
67
|
-
}, alignPoints: [{ align: "br tr" }, { align: "tr br" }], renderBody: ({ closeDropdown }) => renderMenu(item, closeDropdown) }));
|
|
68
|
-
}, [isLarge]);
|
|
78
|
+
}, alignPoints: [{ align: "br tr" }, { align: "tr br" }], renderBody: ({ closeDropdown }) => renderMenu(item, () => closeMenuAndRestoreFocus(closeDropdown)) }));
|
|
79
|
+
}, [isLarge, closeMenuAndRestoreFocus]);
|
|
69
80
|
const renderTextContent = useCallback((item, key, labelId, getTextContent, getMultiLineTextContent, renderSuffixIcon) => {
|
|
70
81
|
if (getMultiLineTextContent) {
|
|
71
82
|
return getMultiLineTextContent(item).map((line, index) => {
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type RefObject } from "react";
|
|
2
|
+
export declare const AsyncTableGridRefProvider: import("react").Provider<RefObject<HTMLElement | null> | null>;
|
|
3
|
+
export declare const useAsyncTableGridRef: () => RefObject<HTMLElement | null> | null;
|
|
4
|
+
//# sourceMappingURL=asyncTableGridContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asyncTableGridContext.d.ts","sourceRoot":"","sources":["../../../../src/@ui/UiAsyncTable/UiAsyncTable/asyncTableGridContext.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAA6B,MAAM,OAAO,CAAC;AAWlE,eAAO,MAAM,yBAAyB,gEAAoC,CAAC;AAE3E,eAAO,MAAM,oBAAoB,4CAA6C,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
import { createContext, useContext } from "react";
|
|
3
|
+
/**
|
|
4
|
+
* Ref to the grid element that holds the table's real DOM focus.
|
|
5
|
+
*
|
|
6
|
+
* The table is a composite widget: the grid is its single tab stop and the active row/cell is tracked
|
|
7
|
+
* virtually via aria-activedescendant (row controls are kept out of the tab order). Layers opened from a
|
|
8
|
+
* row therefore return focus here rather than to the control that opened them.
|
|
9
|
+
*/
|
|
10
|
+
const AsyncTableGridRefContext = createContext(null);
|
|
11
|
+
export const AsyncTableGridRefProvider = AsyncTableGridRefContext.Provider;
|
|
12
|
+
export const useAsyncTableGridRef = () => useContext(AsyncTableGridRefContext);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UiButton.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiButton/UiButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAc,MAAM,OAAO,CAAC;AAIxF,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE/E,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,EACH,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,cAAc,EACtB,MAAM,sBAAsB,CAAC;AAI9B;;GAEG;AACH,MAAM,WAAW,4BAA6B,SAAQ,wBAAwB;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1C,OAAO,CAAC,EACF,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,aAAa,GACb,aAAa,GACb,cAAc,GACd,WAAW,GACX,iBAAiB,GACjB,qBAAqB,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACrD,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,4BAA4B,CAAC;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAQD;;GAEG;AACH,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"UiButton.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiButton/UiButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAc,MAAM,OAAO,CAAC;AAIxF,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE/E,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,EACH,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,cAAc,EACtB,MAAM,sBAAsB,CAAC;AAI9B;;GAEG;AACH,MAAM,WAAW,4BAA6B,SAAQ,wBAAwB;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1C,OAAO,CAAC,EACF,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,aAAa,GACb,aAAa,GACb,cAAc,GACd,WAAW,GACX,iBAAiB,GACjB,qBAAqB,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACrD,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,4BAA4B,CAAC;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAQD;;GAEG;AACH,eAAO,MAAM,QAAQ,8GAyFpB,CAAC"}
|
|
@@ -25,6 +25,6 @@ export const UiButton = forwardRef(({ id, size = "medium", variant = "secondary"
|
|
|
25
25
|
hasIconBefore,
|
|
26
26
|
hasIconAfter,
|
|
27
27
|
isSelected: isSelected ?? false,
|
|
28
|
-
}), disabled: isDisabled, tabIndex: tabIndex, autoFocus: autoFocus, onClick: onClick, onKeyDown: onKeyDown, "data-id": dataId, "data-testid": testId, ...accessibilityConfigToAttributes(accessibilityConfig), children: [iconBefore ? (_jsx(UiIcon, { type: iconBefore, size: iconBeforeSize, accessibilityConfig: { ariaHidden: accessibilityConfig?.iconAriaHidden }, disableAnimation: disableIconAnimation })) : null, _jsx("span", { className: e("text"), style: { maxWidth }, children: label }), badgeAfter !== undefined && typeof badgeAfter === "number" ? (_jsxs("span", { className: e("badge"), children: ["(", badgeAfter, ")"] })) : null, badgeAfter !== undefined && typeof badgeAfter === "string" ? (_jsx("span", { className: e("badge"), children: badgeAfter })) : null, iconAfter ? (_jsx(UiIcon, { type: iconAfter, size: iconAfterSize, accessibilityConfig: { ariaHidden: accessibilityConfig?.iconAriaHidden }, disableAnimation: disableIconAnimation })) : null] }));
|
|
28
|
+
}), disabled: isDisabled, tabIndex: tabIndex, autoFocus: autoFocus, onClick: onClick, onKeyDown: onKeyDown, "data-id": dataId, "data-testid": testId, ...accessibilityConfigToAttributes(accessibilityConfig), children: [iconBefore ? (_jsx(UiIcon, { type: iconBefore, size: iconBeforeSize, accessibilityConfig: { ariaHidden: accessibilityConfig?.iconAriaHidden }, disableAnimation: disableIconAnimation })) : null, _jsx("span", { className: e("text"), "data-testid": `${testId}-label`, style: { maxWidth }, children: label }), badgeAfter !== undefined && typeof badgeAfter === "number" ? (_jsxs("span", { className: e("badge-number"), "data-testid": `${testId}-badge`, children: ["(", badgeAfter, ")"] })) : null, badgeAfter !== undefined && typeof badgeAfter === "string" ? (_jsx("span", { className: e("badge-text"), "data-testid": `${testId}-badge`, children: badgeAfter })) : null, iconAfter ? (_jsx(UiIcon, { type: iconAfter, size: iconAfterSize, accessibilityConfig: { ariaHidden: accessibilityConfig?.iconAriaHidden }, disableAnimation: disableIconAnimation })) : null] }));
|
|
29
29
|
});
|
|
30
30
|
UiButton.displayName = "UiButton";
|
|
@@ -34,6 +34,15 @@ export interface IStylingEditorDialogProps<T extends StylingPickerItemContent> e
|
|
|
34
34
|
* submission and display it, or undefined when the content is valid.
|
|
35
35
|
*/
|
|
36
36
|
validateDefinition?: (content: T) => string | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Optional non-blocking check of the parsed definition content.
|
|
39
|
+
*
|
|
40
|
+
* @remarks
|
|
41
|
+
* Called only when the definition is valid JSON. Return a localized message to display it as a
|
|
42
|
+
* warning, or undefined when there is nothing to report. Unlike {@link IStylingEditorDialogProps.validateDefinition}
|
|
43
|
+
* this never prevents submission — use it for content that applies but degrades the result.
|
|
44
|
+
*/
|
|
45
|
+
validateDefinitionWarning?: (content: T) => string | undefined;
|
|
37
46
|
}
|
|
38
47
|
/**
|
|
39
48
|
* @internal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StylingEditorDialog.d.ts","sourceRoot":"","sources":["../../../src/Dialog/StylingEditorDialog/StylingEditorDialog.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"StylingEditorDialog.d.ts","sourceRoot":"","sources":["../../../src/Dialog/StylingEditorDialog/StylingEditorDialog.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAQnF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,EAEH,KAAK,+BAA+B,EACvC,MAAM,gCAAgC,CAAC;AAGxC;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,aAAa,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,wBAAwB;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,wBAAwB,CACzE,SAAQ,+BAA+B,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,WAAW,CAAC;IACxF,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IACnC,qBAAqB,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;IACxD;;;;;;;OAOG;IACH,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;CAClE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,wBAAwB,EAAE,KAAK,EAAE,yBAAyB,CAAC,CAAC,CAAC,2CAM1G"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// (C) 2022-2026 GoodData Corporation
|
|
3
|
-
import { useMemo, useState } from "react";
|
|
3
|
+
import { useCallback, useMemo, useState } from "react";
|
|
4
4
|
import cx from "classnames";
|
|
5
5
|
import { useIntl } from "react-intl";
|
|
6
6
|
import { IntlWrapper } from "@gooddata/sdk-ui";
|
|
7
7
|
import { Button } from "../../Button/Button.js";
|
|
8
|
+
import { Message } from "../../Messages/Message.js";
|
|
8
9
|
import { Typography } from "../../Typography/Typography.js";
|
|
9
10
|
import { useId } from "../../utils/useId.js";
|
|
10
11
|
import { Dialog } from "../Dialog.js";
|
|
@@ -17,49 +18,48 @@ import { StylingExample } from "./StylingExample.js";
|
|
|
17
18
|
export function StylingEditorDialog(props) {
|
|
18
19
|
return (_jsx(IntlWrapper, { locale: props.locale, children: _jsx(StylingEditorDialogCore, { ...props }) }));
|
|
19
20
|
}
|
|
20
|
-
function StylingEditorDialogCore({ title, tooltip, link, stylingItem, examples, exampleToColorPreview, onClose, onSubmit, onCancel, disableSubmit, showProgressIndicator, showBackButton, onHelpClick, onExit = () => { }, className, onInvalidDefinition = () => { }, validateDefinition, }) {
|
|
21
|
+
function StylingEditorDialogCore({ title, tooltip, link, stylingItem, examples, exampleToColorPreview, onClose, onSubmit, onCancel, disableSubmit, showProgressIndicator, showBackButton, onHelpClick, onExit = () => { }, className, onInvalidDefinition = () => { }, validateDefinition, validateDefinitionWarning, }) {
|
|
21
22
|
const intl = useIntl();
|
|
22
23
|
const providedExamples = !!examples && examples.length !== 0 && !!exampleToColorPreview;
|
|
23
24
|
const initialNameField = stylingItem?.name ?? "";
|
|
24
25
|
const initialDefinitionField = stylingItem?.content ? JSON.stringify(stylingItem?.content, null, 4) : "";
|
|
25
26
|
const [nameField, setNameField] = useState(initialNameField);
|
|
26
27
|
const [definitionField, setDefinitionField] = useState(initialDefinitionField);
|
|
27
|
-
const
|
|
28
|
+
const parsedDefinition = useMemo(() => {
|
|
28
29
|
try {
|
|
29
|
-
|
|
30
|
-
const formattedDefinition = JSON.stringify(parsedDefinition, null, 4);
|
|
31
|
-
return nameField !== initialNameField || formattedDefinition !== initialDefinitionField;
|
|
30
|
+
return { ok: true, content: JSON.parse(definitionField) };
|
|
32
31
|
}
|
|
33
32
|
catch {
|
|
33
|
+
return { ok: false };
|
|
34
|
+
}
|
|
35
|
+
}, [definitionField]);
|
|
36
|
+
const fieldsChanged = useMemo(() => {
|
|
37
|
+
if (!parsedDefinition.ok) {
|
|
34
38
|
// initial state of the fields is presumed to be valid,
|
|
35
39
|
// so if JSON throws error, definition was changed
|
|
36
40
|
return true;
|
|
37
41
|
}
|
|
38
|
-
|
|
42
|
+
const formattedDefinition = JSON.stringify(parsedDefinition.content, null, 4);
|
|
43
|
+
return nameField !== initialNameField || formattedDefinition !== initialDefinitionField;
|
|
44
|
+
}, [parsedDefinition, nameField, initialNameField, initialDefinitionField]);
|
|
39
45
|
const validName = useMemo(() => nameField !== "", [nameField]);
|
|
40
|
-
const validDefinition =
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
catch {
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
}, [definitionField]);
|
|
49
|
-
// Content-level validation (e.g. theme color values) runs only on well-formed JSON.
|
|
50
|
-
const definitionContentError = useMemo(() => {
|
|
51
|
-
if (!validateDefinition || !validDefinition) {
|
|
46
|
+
const validDefinition = parsedDefinition.ok;
|
|
47
|
+
// A callback that throws must not crash the dialog, so it degrades to "nothing to report" and
|
|
48
|
+
// the user can keep working.
|
|
49
|
+
const runContentCheck = useCallback((check, name) => {
|
|
50
|
+
if (!check || !parsedDefinition.ok) {
|
|
52
51
|
return undefined;
|
|
53
52
|
}
|
|
54
53
|
try {
|
|
55
|
-
return
|
|
54
|
+
return check(parsedDefinition.content);
|
|
56
55
|
}
|
|
57
56
|
catch (error) {
|
|
58
|
-
|
|
59
|
-
console.error("StylingEditorDialog: the provided validateDefinition callback threw.", error);
|
|
57
|
+
console.error(`StylingEditorDialog: the provided ${name} callback threw.`, error);
|
|
60
58
|
return undefined;
|
|
61
59
|
}
|
|
62
|
-
}, [
|
|
60
|
+
}, [parsedDefinition]);
|
|
61
|
+
const definitionContentError = useMemo(() => runContentCheck(validateDefinition, "validateDefinition"), [runContentCheck, validateDefinition]);
|
|
62
|
+
const definitionContentWarning = useMemo(() => runContentCheck(validateDefinitionWarning, "validateDefinitionWarning"), [runContentCheck, validateDefinitionWarning]);
|
|
63
63
|
const validFields = useMemo(() => validName && validDefinition && !definitionContentError, [validName, validDefinition, definitionContentError]);
|
|
64
64
|
const isSubmitDisabled = useMemo(() => !validFields || !fieldsChanged || disableSubmit, [validFields, fieldsChanged, disableSubmit]);
|
|
65
65
|
const emptyDefinition = useMemo(() => definitionField === "", [definitionField]);
|
|
@@ -89,10 +89,10 @@ function StylingEditorDialogCore({ title, tooltip, link, stylingItem, examples,
|
|
|
89
89
|
stylingItem?.ref,
|
|
90
90
|
intl,
|
|
91
91
|
]);
|
|
92
|
-
const getFinalStylingItem = (original,
|
|
92
|
+
const getFinalStylingItem = (original, content, name) => {
|
|
93
93
|
return {
|
|
94
94
|
...(original || {}),
|
|
95
|
-
content
|
|
95
|
+
content,
|
|
96
96
|
name,
|
|
97
97
|
};
|
|
98
98
|
};
|
|
@@ -111,13 +111,18 @@ function StylingEditorDialogCore({ title, tooltip, link, stylingItem, examples,
|
|
|
111
111
|
_jsxs("form", { className: "gd-styling-editor-dialog-content-form", onSubmit: (e) => e.preventDefault(), children: [
|
|
112
112
|
_jsxs("label", { className: "gd-styling-editor-dialog-content-form-input", children: [intl.formatMessage({ id: "stylingEditor.dialog.name" }), _jsx("input", { "aria-label": "Styling item name", className: "gd-input-field s-input-field", type: "text", value: nameField, onChange: (e) => setNameField(e.target.value) })
|
|
113
113
|
] }), _jsxs("label", { className: "gd-styling-editor-dialog-content-form-textarea", children: [intl.formatMessage({ id: "stylingEditor.dialog.definition" }), _jsx("textarea", { "aria-label": "Styling item definition", className: "gd-input-field s-textarea-field", wrap: "off", value: definitionField, onChange: (e) => setDefinitionField(e.target.value) })
|
|
114
|
-
] })
|
|
115
|
-
] }), providedExamples ? (_jsxs("div", { className: cx("gd-styling-editor-dialog-content-examples", "s-gd-styling-editor-dialog-content-examples"), children: [
|
|
114
|
+
] }), definitionContentWarning && !definitionContentError ? (_jsx(Message, { type: "warning", className: "gd-styling-editor-dialog-content-form-warning s-styling-editor-warning", children: definitionContentWarning })) : null] }), providedExamples ? (_jsxs("div", { className: cx("gd-styling-editor-dialog-content-examples", "s-gd-styling-editor-dialog-content-examples"), children: [
|
|
116
115
|
_jsx(BubbleHeaderSeparator, { title: intl.formatMessage({ id: "stylingEditor.dialog.examples" }), message: tooltip }), _jsx("div", { className: "gd-styling-editor-dialog-content-examples-list", children: examples.map((example, index) => (_jsx(StylingExample, { name: example.name ?? "", colors: exampleToColorPreview(example.content), onClick: () => {
|
|
117
116
|
setNameField(example.name ?? "");
|
|
118
117
|
setDefinitionField(JSON.stringify(example.content, null, 4));
|
|
119
118
|
} }, index))) })
|
|
120
|
-
] })) : null] }), _jsx(StylingEditorDialogFooter, { disableSubmit: isSubmitDisabled, showProgressIndicator: showProgressIndicator, link: link, errorMessage: errorMessage, onSubmit: () =>
|
|
119
|
+
] })) : null] }), _jsx(StylingEditorDialogFooter, { disableSubmit: isSubmitDisabled, showProgressIndicator: showProgressIndicator, link: link, errorMessage: errorMessage, onSubmit: () => {
|
|
120
|
+
// Submission is disabled while the definition does not parse, so this only
|
|
121
|
+
// narrows the type rather than guarding a reachable state.
|
|
122
|
+
if (parsedDefinition.ok) {
|
|
123
|
+
onSubmit?.(getFinalStylingItem(stylingItem, parsedDefinition.content, nameField));
|
|
124
|
+
}
|
|
125
|
+
}, onCancel: () => {
|
|
121
126
|
onExit?.(nameField, definitionField);
|
|
122
127
|
onCancel?.();
|
|
123
128
|
}, onHelpClick: onHelpClick })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownButton.d.ts","sourceRoot":"","sources":["../../src/Dropdown/DropdownButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAMvF,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,wBAAwB,GAAG;QAAE,SAAS,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAA;KAAE,CAAC;IAEjG,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAElC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC3B,EAAE,EACF,SAAS,EACT,mBAAmB,EAEnB,KAAK,EACL,KAAa,EACb,QAAQ,EAER,MAAM,EACN,OAAc,EACd,QAAQ,EACR,WAAmB,EACnB,OAAO,EACP,QAAQ,EACR,UAAU,EACV,SAAS,EACZ,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"DropdownButton.d.ts","sourceRoot":"","sources":["../../src/Dropdown/DropdownButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAMvF,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,wBAAwB,GAAG;QAAE,SAAS,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAA;KAAE,CAAC;IAEjG,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAElC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC3B,EAAE,EACF,SAAS,EACT,mBAAmB,EAEnB,KAAK,EACL,KAAa,EACb,QAAQ,EAER,MAAM,EACN,OAAc,EACd,QAAQ,EACR,WAAmB,EACnB,OAAO,EACP,QAAQ,EACR,UAAU,EACV,SAAS,EACZ,EAAE,oBAAoB,2CA4DtB"}
|
|
@@ -29,6 +29,11 @@ export function DropdownButton({ id, className, accessibilityConfig, value, titl
|
|
|
29
29
|
ariaLabel,
|
|
30
30
|
ariaLabelledBy,
|
|
31
31
|
ariaDescribedBy,
|
|
32
|
+
// Without a dropdownId the popup id is unknown, but the trigger is still a combobox,
|
|
33
|
+
// so it has to expose its expanded state - callers commonly pass only isOpen - along
|
|
34
|
+
// with any explicitly controlled id.
|
|
35
|
+
ariaExpanded: effectiveAriaExpanded,
|
|
36
|
+
ariaControls,
|
|
32
37
|
role: role ?? "combobox",
|
|
33
38
|
});
|
|
34
39
|
return (_jsx(Button, { id: id, accessibilityConfig: buttonAccessibilityConfig, title: title && typeof title === "string" ? title : undefined, className: buttonClasses, value: value, iconLeft: iconLeft, iconRight: isOpen ? "gd-icon-navigateup" : "gd-icon-navigatedown", disabled: disabled, onClick: onClick, ref: buttonRef, children: children }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownList.d.ts","sourceRoot":"","sources":["../../src/Dropdown/DropdownList.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"DropdownList.d.ts","sourceRoot":"","sources":["../../src/Dropdown/DropdownList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
// (C) 2007-2026 GoodData Corporation
|
|
3
3
|
import { Fragment, useCallback, useEffect, useState, } from "react";
|
|
4
4
|
import cx from "classnames";
|
|
5
|
-
import {
|
|
5
|
+
import { useIntl } from "react-intl";
|
|
6
6
|
import { UiPagedVirtualList, } from "../@ui/UiPagedVirtualList/UiPagedVirtualList.js";
|
|
7
7
|
import { DETAILED_ANNOUNCEMENT_THRESHOLD, UiSearchResultsAnnouncement, } from "../@ui/UiSearchResultsAnnouncement/UiSearchResultsAnnouncement.js";
|
|
8
8
|
import { AutoSize } from "../AutoSize/AutoSize.js";
|
|
@@ -23,7 +23,10 @@ export const DEFAULT_ITEM_HEIGHT = 28;
|
|
|
23
23
|
* @internal
|
|
24
24
|
*/
|
|
25
25
|
export const DEFAULT_MOBILE_ITEM_HEIGHT = 40;
|
|
26
|
-
|
|
26
|
+
function DefaultNoDataComponent({ hasNoMatchingData }) {
|
|
27
|
+
const intl = useIntl();
|
|
28
|
+
return (_jsx(NoData, { hasNoMatchingData: hasNoMatchingData, notFoundLabel: intl.formatMessage({ id: "gs.noData.noMatchingData" }), noDataLabel: intl.formatMessage({ id: "gs.noData.noDataAvailable" }) }));
|
|
29
|
+
}
|
|
27
30
|
const defaultNoData = (props) => {
|
|
28
31
|
return _jsx(DefaultNoDataComponent, { hasNoMatchingData: props.hasNoMatchingData });
|
|
29
32
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/Header/Header.tsx"],"names":[],"mappings":"AA2BA,OAAO,EAAE,KAAK,eAAe,EAA8C,MAAM,cAAc,CAAC;AAyBhG;;GAEG;AACH,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/Header/Header.tsx"],"names":[],"mappings":"AA2BA,OAAO,EAAE,KAAK,eAAe,EAA8C,MAAM,cAAc,CAAC;AAyBhG;;GAEG;AACH,eAAO,MAAM,SAAS,kGAskBpB,CAAC"}
|
package/esm/Header/Header.js
CHANGED
|
@@ -42,7 +42,7 @@ const HEADER_HELP_MENU_ITEM_ID = defineMessage({ id: "gs.header.help" }).id;
|
|
|
42
42
|
/**
|
|
43
43
|
* @internal
|
|
44
44
|
*/
|
|
45
|
-
export const AppHeader = withTheme(function AppHeader({ logoHref = "/", accountMenuItems = [], helpMenuItems = [], menuItemsGroups = [], search, notificationsPanel, workspacePicker, isAccessibilityCompliant, logoUrl, logoTitle, organizationName, className, activeColor, headerColor, headerTextColor, documentationUrl, expiredDate, showUpsellButton, onUpsellButtonClick, badges, showStaticHelpMenu, userName, theme, helpMenuDropdownAlignPoints: helpDropdownAlign, disableHelpDropdown, onHelpClick, helpRedirectUrl, showChatItem, onChatItemClick, onLogoClick, onMenuItemClick, }) {
|
|
45
|
+
export const AppHeader = withTheme(function AppHeader({ logoHref = "/", accountMenuItems = [], helpMenuItems = [], menuItemsGroups = [], search, notificationsPanel, workspacePicker, isAccessibilityCompliant, logoUrl, logoTitle, organizationName, className, activeColor, headerColor, headerTextColor, documentationUrl, expiredDate, showUpsellButton, onUpsellButtonClick, badges, showStaticHelpMenu, userName, theme, helpMenuDropdownAlignPoints: helpDropdownAlign, disableHelpDropdown, onHelpClick, helpRedirectUrl, showChatItem, isChatOpen, onChatItemClick, onLogoClick, onMenuItemClick, }) {
|
|
46
46
|
const intl = useIntl();
|
|
47
47
|
const [state, setState] = useState({
|
|
48
48
|
childrenWidth: 0,
|
|
@@ -345,7 +345,7 @@ export const AppHeader = withTheme(function AppHeader({ logoHref = "/", accountM
|
|
|
345
345
|
};
|
|
346
346
|
const renderStandardNav = () => {
|
|
347
347
|
return (_jsxs("div", { className: "gd-header-stretch gd-header-menu-wrapper", children: [
|
|
348
|
-
_jsx(HeaderMenu, { onMenuItemClick: onMenuItemClick, sections: menuItemsGroups, className: "gd-header-menu-horizontal" }), renderTrialItems(), showChatItem ? (_jsx(HeaderChatButton, { title: intl.formatMessage(messages.aiChat), onClick: onChatItemClick ?? (() => { }) })) : null, notificationsPanel
|
|
348
|
+
_jsx(HeaderMenu, { onMenuItemClick: onMenuItemClick, sections: menuItemsGroups, className: "gd-header-menu-horizontal" }), renderTrialItems(), showChatItem ? (_jsx(HeaderChatButton, { title: intl.formatMessage(messages.aiChat), isOpen: isChatOpen, onClick: onChatItemClick ?? (() => { }) })) : null, notificationsPanel
|
|
349
349
|
? notificationsPanel({
|
|
350
350
|
isMobile: false,
|
|
351
351
|
closeNotificationsOverlay: closeNotificationsMenu,
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import { type MouseEvent } from "react";
|
|
2
2
|
type HeaderChatButtonProps = {
|
|
3
3
|
title?: string;
|
|
4
|
+
isOpen?: boolean;
|
|
4
5
|
onClick: (e: MouseEvent) => void;
|
|
5
6
|
};
|
|
6
7
|
/**
|
|
7
8
|
* @internal
|
|
8
9
|
*/
|
|
9
10
|
export declare const HEADER_CHAT_BUTTON_ID = "gd-header-chat-button";
|
|
10
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Id of the assistant panel this button opens. Set on the chat dialog so the button can reference it
|
|
13
|
+
* through aria-controls.
|
|
14
|
+
*
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export declare const HEADER_CHAT_PANEL_ID = "gd-header-chat-panel";
|
|
18
|
+
export declare function HeaderChatButton({ title, isOpen, onClick }: HeaderChatButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
11
19
|
export {};
|
|
12
20
|
//# sourceMappingURL=HeaderChatButton.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderChatButton.d.ts","sourceRoot":"","sources":["../../src/Header/HeaderChatButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,OAAO,CAAC;AAOxC,KAAK,qBAAqB,GAAG;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;CACpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAE7D,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"HeaderChatButton.d.ts","sourceRoot":"","sources":["../../src/Header/HeaderChatButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,OAAO,CAAC;AAOxC,KAAK,qBAAqB,GAAG;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;CACpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAE3D,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAc,EAAE,OAAO,EAAE,EAAE,qBAAqB,2CAoBzF"}
|
|
@@ -6,10 +6,21 @@ import { Button } from "../Button/Button.js";
|
|
|
6
6
|
* @internal
|
|
7
7
|
*/
|
|
8
8
|
export const HEADER_CHAT_BUTTON_ID = "gd-header-chat-button";
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Id of the assistant panel this button opens. Set on the chat dialog so the button can reference it
|
|
11
|
+
* through aria-controls.
|
|
12
|
+
*
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export const HEADER_CHAT_PANEL_ID = "gd-header-chat-panel";
|
|
16
|
+
export function HeaderChatButton({ title, isOpen = false, onClick }) {
|
|
10
17
|
const classNames = cx("gd-header-measure", "gd-header-button", "gd-header-chat");
|
|
11
18
|
// The text is not l18n-ed because it is not final
|
|
12
19
|
return (_jsx(Button, { id: HEADER_CHAT_BUTTON_ID, title: title, className: classNames, onClick: onClick, accessibilityConfig: {
|
|
13
20
|
ariaLabel: title,
|
|
21
|
+
ariaHaspopup: "dialog",
|
|
22
|
+
ariaExpanded: isOpen,
|
|
23
|
+
// The panel is mounted only while open, so reference it only then.
|
|
24
|
+
ariaControls: isOpen ? HEADER_CHAT_PANEL_ID : undefined,
|
|
14
25
|
}, children: _jsx(UiIcon, { type: "genai", size: 16 }) }));
|
|
15
26
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { type IntlShape } from "react-intl";
|
|
2
1
|
import { type IHeaderMenuItem } from "./typings.js";
|
|
3
2
|
/**
|
|
4
3
|
* @internal
|
|
@@ -11,7 +10,6 @@ export interface IHeaderDataMenuItem extends IHeaderMenuItem {
|
|
|
11
10
|
* @internal
|
|
12
11
|
*/
|
|
13
12
|
export interface IHeaderDataMenuProps {
|
|
14
|
-
intl: IntlShape;
|
|
15
13
|
className?: string;
|
|
16
14
|
onMenuItemClick: (item: IHeaderDataMenuItem) => void;
|
|
17
15
|
dataMenuItems: IHeaderDataMenuItem[];
|
|
@@ -19,7 +17,5 @@ export interface IHeaderDataMenuProps {
|
|
|
19
17
|
/**
|
|
20
18
|
* @internal
|
|
21
19
|
*/
|
|
22
|
-
export declare
|
|
23
|
-
WrappedComponent: import("react").ComponentType<IHeaderDataMenuProps>;
|
|
24
|
-
};
|
|
20
|
+
export declare function HeaderDataMenu({ onMenuItemClick, dataMenuItems, className }: IHeaderDataMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
25
21
|
//# sourceMappingURL=HeaderDataMenu.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderDataMenu.d.ts","sourceRoot":"","sources":["../../src/Header/HeaderDataMenu.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HeaderDataMenu.d.ts","sourceRoot":"","sources":["../../src/Header/HeaderDataMenu.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IACxD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACrD,aAAa,EAAE,mBAAmB,EAAE,CAAC;CACxC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CAgDjG"}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// (C) 2020-2026 GoodData Corporation
|
|
3
3
|
import cx from "classnames";
|
|
4
|
-
import {
|
|
4
|
+
import { useIntl } from "react-intl";
|
|
5
5
|
import { v4 as uuid } from "uuid";
|
|
6
6
|
import { Bubble } from "../Bubble/Bubble.js";
|
|
7
7
|
import { BubbleHoverTrigger } from "../Bubble/BubbleHoverTrigger.js";
|
|
8
8
|
import { Button } from "../Button/Button.js";
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export function HeaderDataMenu({ onMenuItemClick, dataMenuItems, className }) {
|
|
13
|
+
const intl = useIntl();
|
|
10
14
|
const renderSection = (items) => {
|
|
11
15
|
return items.map((item) => {
|
|
12
16
|
const { isDisable, tooltipText, isActive, className, key, onClick } = item;
|
|
@@ -22,7 +26,3 @@ function CoreHeaderDataMenu({ intl, onMenuItemClick, dataMenuItems, className })
|
|
|
22
26
|
const dataMenuClassName = cx("gd-data-header-menu-section", className);
|
|
23
27
|
return (_jsx("div", { className: "gd-data-header-menu-wrapper", children: _jsx("ul", { className: dataMenuClassName, children: renderSection(dataMenuItems) }, `section-${uuid()}`) }));
|
|
24
28
|
}
|
|
25
|
-
/**
|
|
26
|
-
* @internal
|
|
27
|
-
*/
|
|
28
|
-
export const HeaderDataMenu = injectIntl(CoreHeaderDataMenu);
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
|
-
import { type IntlShape } from "react-intl";
|
|
3
2
|
import { type HelpMenuDropdownAlignPoints } from "../typings/positioning.js";
|
|
4
3
|
interface IHelpItem {
|
|
5
4
|
key: string;
|
|
@@ -13,7 +12,6 @@ interface IHelpItem {
|
|
|
13
12
|
onClick?: (obj: any) => void;
|
|
14
13
|
}
|
|
15
14
|
interface IHeaderHelpProps {
|
|
16
|
-
intl: IntlShape;
|
|
17
15
|
className: string;
|
|
18
16
|
helpMenuDropdownAlignPoints?: HelpMenuDropdownAlignPoints;
|
|
19
17
|
items: IHelpItem[];
|
|
@@ -22,8 +20,6 @@ interface IHeaderHelpProps {
|
|
|
22
20
|
onHelpClicked?: (isOpen?: boolean) => void;
|
|
23
21
|
helpRedirectUrl?: string;
|
|
24
22
|
}
|
|
25
|
-
export declare
|
|
26
|
-
WrappedComponent: import("react").ComponentType<IHeaderHelpProps>;
|
|
27
|
-
};
|
|
23
|
+
export declare function HeaderHelp({ className, items, helpMenuDropdownAlignPoints, onMenuItemClick, disableDropdown, onHelpClicked, helpRedirectUrl }: IHeaderHelpProps): import("react/jsx-runtime").JSX.Element;
|
|
28
24
|
export {};
|
|
29
25
|
//# sourceMappingURL=HeaderHelp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderHelp.d.ts","sourceRoot":"","sources":["../../src/Header/HeaderHelp.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAiC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"HeaderHelp.d.ts","sourceRoot":"","sources":["../../src/Header/HeaderHelp.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAiC,MAAM,OAAO,CAAC;AAStE,OAAO,EAAE,KAAK,2BAA2B,EAAoB,MAAM,2BAA2B,CAAC;AAG/F,UAAU,SAAS;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;CAChC;AAED,UAAU,gBAAgB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;IAC1D,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,eAAe,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAC3C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,UAAU,CAAC,EACvB,SAAS,EACT,KAAK,EACL,2BAA2B,EAC3B,eAAe,EACf,eAAe,EACf,aAAa,EACb,eAAe,EAClB,EAAE,gBAAgB,2CAkIlB"}
|
package/esm/Header/HeaderHelp.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
// (C) 2021-
|
|
2
|
+
// (C) 2021-2026 GoodData Corporation
|
|
3
3
|
import { useCallback, useRef, useState } from "react";
|
|
4
4
|
import cx from "classnames";
|
|
5
5
|
import { isEmpty } from "lodash-es";
|
|
6
|
-
import { FormattedMessage,
|
|
6
|
+
import { FormattedMessage, useIntl } from "react-intl";
|
|
7
7
|
import { UiFocusManager } from "../@ui/UiFocusManager/UiFocusManager.js";
|
|
8
8
|
import { Button } from "../Button/Button.js";
|
|
9
9
|
import { Overlay } from "../Overlay/Overlay.js";
|
|
10
10
|
import { useIdPrefixed } from "../utils/useId.js";
|
|
11
|
-
function
|
|
11
|
+
export function HeaderHelp({ className, items, helpMenuDropdownAlignPoints, onMenuItemClick, disableDropdown, onHelpClicked, helpRedirectUrl, }) {
|
|
12
|
+
const intl = useIntl();
|
|
12
13
|
const [isOpen, setIsOpen] = useState(false);
|
|
13
14
|
const helpMenuButtonRef = useRef(null);
|
|
14
15
|
const dropdownId = useIdPrefixed("help-dropdown");
|
|
@@ -68,4 +69,3 @@ function CoreHeaderHelp({ className, items, helpMenuDropdownAlignPoints, onMenuI
|
|
|
68
69
|
}, ref: helpMenuButtonRef, children: [
|
|
69
70
|
_jsx(FormattedMessage, { id: "gs.header.help" }), renderHelpMenu()] }));
|
|
70
71
|
}
|
|
71
|
-
export const HeaderHelp = injectIntl(CoreHeaderHelp);
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
|
-
import { type IntlShape } from "react-intl";
|
|
3
2
|
/**
|
|
4
3
|
* @internal
|
|
5
4
|
*/
|
|
@@ -13,7 +12,6 @@ export interface IHeaderWorkspace {
|
|
|
13
12
|
* @internal
|
|
14
13
|
*/
|
|
15
14
|
export interface IHeaderWorkspacePickerProps {
|
|
16
|
-
intl: IntlShape;
|
|
17
15
|
className?: string;
|
|
18
16
|
isLoading?: boolean;
|
|
19
17
|
selectedWorkspace?: IHeaderWorkspace;
|
|
@@ -35,7 +33,5 @@ export interface IHeaderWorkspacePickerProps {
|
|
|
35
33
|
/**
|
|
36
34
|
* @internal
|
|
37
35
|
*/
|
|
38
|
-
export declare
|
|
39
|
-
WrappedComponent: import("react").ComponentType<IHeaderWorkspacePickerProps>;
|
|
40
|
-
};
|
|
36
|
+
export declare function HeaderWorkspacePicker({ isLoading, workspaces, selectedWorkspace, totalWorkspacesCount, searchString, showSearch, onOpen, onSelect, onSearch, projectPickerFooter, className, onOpenStateChanged, loadNextPage, hasNextPage, skeletonItemsCount, isNextPageLoading, shouldLoadNextPage }: IHeaderWorkspacePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
41
37
|
//# sourceMappingURL=HeaderWorkspacePicker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderWorkspacePicker.d.ts","sourceRoot":"","sources":["../../src/Header/HeaderWorkspacePicker.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"HeaderWorkspacePicker.d.ts","sourceRoot":"","sources":["../../src/Header/HeaderWorkspacePicker.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAgBvC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,iBAAiB,CAAC,EAAE,gBAAgB,CAAC;IACrC,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAEhC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAE/C,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3G;AA4BD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EAClC,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,mBAAmB,EACnB,SAAS,EACT,kBAAkB,EAElB,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EACrB,EAAE,2BAA2B,2CAkI7B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import cx from "classnames";
|
|
3
|
-
import {
|
|
3
|
+
import { useIntl } from "react-intl";
|
|
4
4
|
import { UiSkeleton } from "../@ui/UiSkeleton/UiSkeleton.js";
|
|
5
5
|
import { Dropdown } from "../Dropdown/Dropdown.js";
|
|
6
6
|
import { DropdownList } from "../Dropdown/DropdownList.js";
|
|
@@ -22,9 +22,13 @@ const renderProjectPickerFooter = (projectPickerFooter) => {
|
|
|
22
22
|
comp.displayName = "ProjectPickerFooter";
|
|
23
23
|
return comp;
|
|
24
24
|
};
|
|
25
|
-
|
|
25
|
+
/**
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
export function HeaderWorkspacePicker({ isLoading, workspaces, selectedWorkspace, totalWorkspacesCount, searchString, showSearch, onOpen, onSelect, onSearch, projectPickerFooter, className, onOpenStateChanged,
|
|
26
29
|
//paging props
|
|
27
30
|
loadNextPage, hasNextPage, skeletonItemsCount, isNextPageLoading, shouldLoadNextPage, }) {
|
|
31
|
+
const intl = useIntl();
|
|
28
32
|
const dropdownClassNames = cx({
|
|
29
33
|
"gd-header-project-wrapper": true,
|
|
30
34
|
"gd-header-measure": true,
|
|
@@ -72,7 +76,3 @@ loadNextPage, hasNextPage, skeletonItemsCount, isNextPageLoading, shouldLoadNext
|
|
|
72
76
|
ariaLabel: intl.formatMessage({ id: "gs.header.projectPicker.workspaces" }),
|
|
73
77
|
} }) })) }));
|
|
74
78
|
}
|
|
75
|
-
/**
|
|
76
|
-
* @internal
|
|
77
|
-
*/
|
|
78
|
-
export const HeaderWorkspacePicker = injectIntl(CoreHeaderWorkspacePicker);
|