@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.
Files changed (55) hide show
  1. package/esm/@ui/UiAsyncTable/UiAsyncTable/UiAsyncTableBody.d.ts.map +1 -1
  2. package/esm/@ui/UiAsyncTable/UiAsyncTable/UiAsyncTableBody.js +9 -6
  3. package/esm/@ui/UiAsyncTable/UiAsyncTable/UiAsyncTableRow.d.ts.map +1 -1
  4. package/esm/@ui/UiAsyncTable/UiAsyncTable/UiAsyncTableRow.js +13 -2
  5. package/esm/@ui/UiAsyncTable/UiAsyncTable/asyncTableGridContext.d.ts +4 -0
  6. package/esm/@ui/UiAsyncTable/UiAsyncTable/asyncTableGridContext.d.ts.map +1 -0
  7. package/esm/@ui/UiAsyncTable/UiAsyncTable/asyncTableGridContext.js +12 -0
  8. package/esm/@ui/UiButton/UiButton.d.ts.map +1 -1
  9. package/esm/@ui/UiButton/UiButton.js +1 -1
  10. package/esm/Dialog/StylingEditorDialog/StylingEditorDialog.d.ts +9 -0
  11. package/esm/Dialog/StylingEditorDialog/StylingEditorDialog.d.ts.map +1 -1
  12. package/esm/Dialog/StylingEditorDialog/StylingEditorDialog.js +33 -28
  13. package/esm/Dropdown/DropdownButton.d.ts.map +1 -1
  14. package/esm/Dropdown/DropdownButton.js +5 -0
  15. package/esm/Dropdown/DropdownList.d.ts.map +1 -1
  16. package/esm/Dropdown/DropdownList.js +5 -2
  17. package/esm/Header/Header.d.ts.map +1 -1
  18. package/esm/Header/Header.js +2 -2
  19. package/esm/Header/HeaderChatButton.d.ts +9 -1
  20. package/esm/Header/HeaderChatButton.d.ts.map +1 -1
  21. package/esm/Header/HeaderChatButton.js +12 -1
  22. package/esm/Header/HeaderDataMenu.d.ts +1 -5
  23. package/esm/Header/HeaderDataMenu.d.ts.map +1 -1
  24. package/esm/Header/HeaderDataMenu.js +6 -6
  25. package/esm/Header/HeaderHelp.d.ts +1 -5
  26. package/esm/Header/HeaderHelp.d.ts.map +1 -1
  27. package/esm/Header/HeaderHelp.js +4 -4
  28. package/esm/Header/HeaderWorkspacePicker.d.ts +1 -5
  29. package/esm/Header/HeaderWorkspacePicker.d.ts.map +1 -1
  30. package/esm/Header/HeaderWorkspacePicker.js +6 -6
  31. package/esm/Header/HeaderWorkspacePickerItem.d.ts +1 -5
  32. package/esm/Header/HeaderWorkspacePickerItem.d.ts.map +1 -1
  33. package/esm/Header/HeaderWorkspacePickerItem.js +3 -3
  34. package/esm/Header/typings.d.ts +5 -0
  35. package/esm/Header/typings.d.ts.map +1 -1
  36. package/esm/Header/typings.js +1 -1
  37. package/esm/List/LegacyInvertableList.d.ts.map +1 -1
  38. package/esm/List/LegacyInvertableList.js +2 -2
  39. package/esm/Timepicker/Timepicker.d.ts +2 -3
  40. package/esm/Timepicker/Timepicker.d.ts.map +1 -1
  41. package/esm/Timepicker/Timepicker.js +4 -4
  42. package/esm/Timezone/TimezoneSelect.d.ts +10 -2
  43. package/esm/Timezone/TimezoneSelect.d.ts.map +1 -1
  44. package/esm/Timezone/TimezoneSelect.js +4 -3
  45. package/esm/index.d.ts +1 -1
  46. package/esm/index.d.ts.map +1 -1
  47. package/esm/index.js +1 -1
  48. package/esm/sdk-ui-kit.d.ts +33 -9
  49. package/package.json +11 -11
  50. package/src/@ui/UiButton/UiButton.scss +5 -1
  51. package/styles/css/main.css +7 -1
  52. package/styles/css/main.css.map +1 -1
  53. package/styles/css/stylingEditorDialog.css +3 -0
  54. package/styles/css/stylingEditorDialog.css.map +1 -1
  55. 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;AAK1D,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,2CAoD3B"}
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
- "aria-activedescendant": activeDescendantId,
24
- }, children: (item, focusedIndex) => {
25
- const itemIndex = focusedIndex ?? 0;
26
- return renderItem(item, itemIndex, focusedItemRef, itemIndex === focusedRowIndex, focusedColumnIndex);
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;AAOrB,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"}
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,8GAqFpB,CAAC"}
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;AAOnF,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;CAC3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,wBAAwB,EAAE,KAAK,EAAE,yBAAyB,CAAC,CAAC,CAAC,2CAM1G"}
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 fieldsChanged = useMemo(() => {
28
+ const parsedDefinition = useMemo(() => {
28
29
  try {
29
- const parsedDefinition = JSON.parse(definitionField);
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
- }, [nameField, initialNameField, definitionField, initialDefinitionField]);
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 = useMemo(() => {
41
- try {
42
- JSON.parse(definitionField);
43
- return true;
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 validateDefinition(JSON.parse(definitionField));
54
+ return check(parsedDefinition.content);
56
55
  }
57
56
  catch (error) {
58
- // a buggy validator must not crash the dialog; degrade gracefully and let the user proceed
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
- }, [validateDefinition, validDefinition, definitionField]);
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, definition, name) => {
92
+ const getFinalStylingItem = (original, content, name) => {
93
93
  return {
94
94
  ...(original || {}),
95
- content: JSON.parse(definition),
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: () => onSubmit?.(getFinalStylingItem(stylingItem, definitionField, nameField)), onCancel: () => {
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,2CAuDtB"}
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 { injectIntl } from "react-intl";
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
- const DefaultNoDataComponent = injectIntl(({ hasNoMatchingData, intl }) => (_jsx(NoData, { hasNoMatchingData: hasNoMatchingData, notFoundLabel: intl.formatMessage({ id: "gs.noData.noMatchingData" }), noDataLabel: intl.formatMessage({ id: "gs.noData.noDataAvailable" }) })));
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,kGAokBpB,CAAC"}
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"}
@@ -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
- export declare function HeaderChatButton({ title, onClick }: HeaderChatButtonProps): import("react/jsx-runtime").JSX.Element;
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,2CAgBzE"}
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
- export function HeaderChatButton({ title, onClick }) {
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 const HeaderDataMenu: import("react").FC<import("react-intl").WithIntlProps<IHeaderDataMenuProps>> & {
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":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,YAAY,CAAC;AAOxD,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,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACrD,aAAa,EAAE,mBAAmB,EAAE,CAAC;CACxC;AAkDD;;GAEG;AACH,eAAO,MAAM,cAAc;;CAAiC,CAAC"}
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 { injectIntl } from "react-intl";
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
- function CoreHeaderDataMenu({ intl, onMenuItemClick, dataMenuItems, className }) {
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 const HeaderHelp: import("react").FC<import("react-intl").WithIntlProps<IHeaderHelpProps>> & {
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;AAItE,OAAO,EAAoB,KAAK,SAAS,EAAc,MAAM,YAAY,CAAC;AAK1E,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,IAAI,EAAE,SAAS,CAAC;IAChB,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;AA6ID,eAAO,MAAM,UAAU;;CAA6B,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"}
@@ -1,14 +1,15 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // (C) 2021-2025 GoodData Corporation
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, injectIntl } from "react-intl";
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 CoreHeaderHelp({ className, items, helpMenuDropdownAlignPoints, onMenuItemClick, disableDropdown, onHelpClicked, helpRedirectUrl, intl, }) {
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 const HeaderWorkspacePicker: import("react").FC<import("react-intl").WithIntlProps<IHeaderWorkspacePickerProps>> & {
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;AAGvC,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,YAAY,CAAC;AAaxD;;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,IAAI,EAAE,SAAS,CAAC;IAChB,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;AAiLD;;GAEG;AACH,eAAO,MAAM,qBAAqB;;CAAwC,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 { injectIntl } from "react-intl";
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
- function CoreHeaderWorkspacePicker({ intl, isLoading, workspaces, selectedWorkspace, totalWorkspacesCount, searchString, showSearch, onOpen, onSelect, onSearch, projectPickerFooter, className, onOpenStateChanged,
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);