@gravity-ui/navigation 0.20.0 → 0.21.1

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.
@@ -7,6 +7,7 @@ export interface SettingsProps {
7
7
  filterPlaceholder?: string;
8
8
  emptyPlaceholder?: string;
9
9
  initialPage?: string;
10
+ initialSearch?: string;
10
11
  onPageChange?: (page: string | undefined) => void;
11
12
  renderNotFound?: () => React.ReactNode;
12
13
  renderLoading?: () => React.ReactNode;
@@ -36,6 +37,7 @@ export interface SettingsSectionProps {
36
37
  }
37
38
  export interface SettingsItemProps {
38
39
  title: string;
40
+ highlightedTitle?: React.ReactNode | null;
39
41
  renderTitleComponent?: (highlightedTitle: React.ReactNode | null) => React.ReactNode;
40
42
  align?: 'top' | 'center';
41
43
  children: React.ReactNode;
@@ -51,5 +53,5 @@ export declare namespace Settings {
51
53
  var Group: ({ children }: SettingsGroupProps) => React.JSX.Element;
52
54
  var Page: ({ children }: SettingsPageProps) => React.JSX.Element;
53
55
  var Section: ({ children }: SettingsSectionProps) => React.JSX.Element;
54
- var Item: ({ title, children, align, withBadge, renderTitleComponent, mode, description, }: SettingsItemProps) => React.JSX.Element;
56
+ var Item: ({ title, highlightedTitle, children, align, withBadge, renderTitleComponent, mode, description, }: SettingsItemProps) => React.JSX.Element;
55
57
  }
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import { TextInputSize } from '@gravity-ui/uikit';
3
3
  interface SettingsSearchProps {
4
4
  className?: string;
5
+ initialValue?: string;
5
6
  onChange: (search: string) => void;
6
7
  debounce?: number;
7
8
  inputRef?: React.Ref<HTMLInputElement>;
@@ -9,5 +10,5 @@ interface SettingsSearchProps {
9
10
  placeholder?: string;
10
11
  autoFocus?: boolean;
11
12
  }
12
- export declare function SettingsSearch({ className, onChange, debounce, inputRef, inputSize, placeholder, autoFocus, }: SettingsSearchProps): React.JSX.Element;
13
+ export declare function SettingsSearch({ className, initialValue, onChange, debounce, inputRef, inputSize, placeholder, autoFocus, }: SettingsSearchProps): React.JSX.Element;
13
14
  export {};
@@ -1177,29 +1177,30 @@ const Item$1 = (props) => {
1177
1177
  React__default.createElement("div", { onMouseEnter: () => onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter(), onMouseLeave: () => onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave(), className: b$n('btn-icon') }, iconEl))) : (iconEl);
1178
1178
  };
1179
1179
  const makeNode = ({ icon: iconEl, title: titleEl }) => {
1180
- const createdNode = (React__default.createElement("div", { className: b$n({ type, current, compact }, className), ref: ref, onClick: (event) => {
1181
- if (collapsedItem) {
1182
- /**
1183
- * If we call onItemClick for collapsedItem then:
1184
- * - User get unexpected item in onItemClick callback
1185
- * - onClosePanel calls twice for each popuped item, as result it will prevent opening of panelItems
1186
- */
1187
- toggleOpen(!open);
1188
- }
1189
- else {
1190
- onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item, false, event);
1191
- }
1192
- }, onClickCapture: onItemClickCapture, onMouseEnter: () => {
1193
- if (!compact) {
1194
- onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter();
1195
- }
1196
- }, onMouseLeave: () => {
1197
- if (!compact) {
1198
- onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave();
1199
- }
1200
- } },
1201
- React__default.createElement("div", { className: b$n('icon-place'), ref: highlightedRef }, makeIconNode(iconEl)),
1202
- React__default.createElement("div", { className: b$n('title'), title: typeof item.title === 'string' ? item.title : undefined }, titleEl),
1180
+ const createdNode = (React__default.createElement(React__default.Fragment, null,
1181
+ React__default.createElement("div", { className: b$n({ type, current, compact }, className), ref: ref, onClick: (event) => {
1182
+ if (collapsedItem) {
1183
+ /**
1184
+ * If we call onItemClick for collapsedItem then:
1185
+ * - User get unexpected item in onItemClick callback
1186
+ * - onClosePanel calls twice for each popuped item, as result it will prevent opening of panelItems
1187
+ */
1188
+ toggleOpen(!open);
1189
+ }
1190
+ else {
1191
+ onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item, false, event);
1192
+ }
1193
+ }, onClickCapture: onItemClickCapture, onMouseEnter: () => {
1194
+ if (!compact) {
1195
+ onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter();
1196
+ }
1197
+ }, onMouseLeave: () => {
1198
+ if (!compact) {
1199
+ onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave();
1200
+ }
1201
+ } },
1202
+ React__default.createElement("div", { className: b$n('icon-place'), ref: highlightedRef }, makeIconNode(iconEl)),
1203
+ React__default.createElement("div", { className: b$n('title'), title: typeof item.title === 'string' ? item.title : undefined }, titleEl)),
1203
1204
  renderPopupContent && Boolean(anchorRef === null || anchorRef === void 0 ? void 0 : anchorRef.current) && (React__default.createElement(Popup, { contentClassName: b$n('popup'), open: popupVisible, keepMounted: popupKeepMounted, placement: popupPlacement, offset: popupOffset, anchorRef: anchorRef, onClose: onClose }, renderPopupContent()))));
1204
1205
  return item.link ? (React__default.createElement("a", { href: item.link, className: b$n('link') }, createdNode)) : (createdNode);
1205
1206
  };
@@ -5087,11 +5088,15 @@ function escapeStringForRegExp(input) {
5087
5088
  }
5088
5089
 
5089
5090
  const b$9 = block('settings-search');
5090
- function SettingsSearch({ className, onChange, debounce = 200, inputRef, inputSize, placeholder, autoFocus = true, }) {
5091
- const onChangeStable = useStableCallback(onChange);
5092
- const handleUpdate = React__default.useCallback(debounce_1(onChangeStable, debounce), [debounce]);
5091
+ function SettingsSearch({ className, initialValue, onChange, debounce = 200, inputRef, inputSize, placeholder, autoFocus = true, }) {
5092
+ const [value, setValue] = React__default.useState(initialValue !== null && initialValue !== void 0 ? initialValue : '');
5093
+ const onChangeDebounced = useStableCallback(debounce_1(onChange, debounce));
5094
+ const handleUpdate = useStableCallback((updated) => {
5095
+ setValue(updated);
5096
+ onChangeDebounced(updated);
5097
+ });
5093
5098
  return (React__default.createElement("div", { className: b$9(null, className) },
5094
- React__default.createElement(TextInput, { controlRef: inputRef, hasClear: true, autoFocus: autoFocus, size: inputSize, placeholder: placeholder, onUpdate: handleUpdate })));
5099
+ React__default.createElement(TextInput, { value: value, controlRef: inputRef, hasClear: true, autoFocus: autoFocus, size: inputSize, placeholder: placeholder, onUpdate: handleUpdate })));
5095
5100
  }
5096
5101
 
5097
5102
  var css_248z$8 = ".gn-settings-menu__group-heading {\n font-weight: var(--g-text-accent-font-weight);\n display: inline-block;\n padding: 0 20px;\n margin-bottom: 12px;\n line-height: 18px;\n}\n.gn-settings-menu__group + .gn-settings-menu__group {\n margin-top: 24px;\n}\n.gn-settings-menu__item {\n display: flex;\n align-items: center;\n height: 40px;\n padding: 0 20px;\n cursor: pointer;\n color: var(--g-color-text-primary);\n}\n.gn-settings-menu__item-icon {\n color: var(--g-color-text-misc);\n margin-right: 5px;\n}\n.gn-settings-menu__item:hover, .gn-settings-menu__item_focused {\n background: var(--g-color-base-simple-hover);\n}\n.gn-settings-menu__item_selected {\n background: var(--g-color-base-selection);\n}\n.gn-settings-menu__item_selected:hover, .gn-settings-menu__item_selected.gn-settings-menu__item_focused {\n background: var(--g-color-base-selection-hover);\n}\n.gn-settings-menu__item_disabled {\n color: var(--g-color-text-secondary);\n cursor: auto;\n}\n.gn-settings-menu__item_disabled:hover {\n background: none;\n}\n.gn-settings-menu__item_disabled .gn-settings-menu__item-icon {\n color: var(--g-color-base-misc-heavy);\n}\n.gn-settings-menu__item_badge {\n position: relative;\n}\n.gn-settings-menu__item_badge::after {\n content: \"\";\n display: block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: var(--g-color-text-danger);\n position: absolute;\n right: 9px;\n top: calc(50% - 3px);\n}";
@@ -5363,9 +5368,9 @@ const getPageTitleById = (menu, activePage) => {
5363
5368
  }
5364
5369
  return '';
5365
5370
  };
5366
- function SettingsContent({ initialPage, children, renderNotFound, title = i18n$1('label_title'), filterPlaceholder = i18n$1('label_filter-placeholder'), emptyPlaceholder = i18n$1('label_empty-placeholder'), view, onPageChange, onClose, }) {
5371
+ function SettingsContent({ initialPage, initialSearch, children, renderNotFound, title = i18n$1('label_title'), filterPlaceholder = i18n$1('label_filter-placeholder'), emptyPlaceholder = i18n$1('label_empty-placeholder'), view, onPageChange, onClose, }) {
5367
5372
  var _a, _b;
5368
- const [search, setSearch] = React__default.useState('');
5373
+ const [search, setSearch] = React__default.useState(initialSearch !== null && initialSearch !== void 0 ? initialSearch : '');
5369
5374
  const { menu, pages } = getSettingsFromChildren(children, search);
5370
5375
  const pageKeys = Object.keys(pages);
5371
5376
  const [selectedPage, setCurrentPage] = React__default.useState(initialPage && pageKeys.includes(initialPage) ? initialPage : undefined);
@@ -5414,13 +5419,13 @@ function SettingsContent({ initialPage, children, renderNotFound, title = i18n$1
5414
5419
  section.showTitle && (React__default.createElement("h3", { className: b$6('section-heading') }, section.title)),
5415
5420
  section.header &&
5416
5421
  (isMobile ? (React__default.createElement("div", { className: b$6('section-subheader') }, section.header)) : (section.header)),
5417
- section.items.map(({ hidden, title, element }) => hidden ? null : (React__default.createElement("div", { key: title, className: b$6('section-item') }, React__default.cloneElement(element, Object.assign(Object.assign({}, element.props), { title: search && title
5422
+ section.items.map(({ hidden, title, element }) => hidden ? null : (React__default.createElement("div", { key: title, className: b$6('section-item') }, React__default.cloneElement(element, Object.assign(Object.assign({}, element.props), { highlightedTitle: search && title
5418
5423
  ? prepareTitle(title, search)
5419
5424
  : title })))))))))));
5420
5425
  };
5421
5426
  return (React__default.createElement("div", { className: b$6({ view }) },
5422
5427
  isMobile ? (React__default.createElement(React__default.Fragment, null,
5423
- React__default.createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), onChange: setSearch, autoFocus: false, inputSize: 'l' }),
5428
+ React__default.createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), initialValue: initialSearch, onChange: setSearch, autoFocus: false, inputSize: 'l' }),
5424
5429
  React__default.createElement(SettingsMenuMobile, { items: menu, onChange: handlePageChange, activeItemId: activePage, className: b$6('tabs') }))) : (React__default.createElement("div", { className: b$6('menu'), onClick: () => {
5425
5430
  if (searchInputRef.current) {
5426
5431
  searchInputRef.current.focus();
@@ -5433,7 +5438,7 @@ function SettingsContent({ initialPage, children, renderNotFound, title = i18n$1
5433
5438
  }
5434
5439
  } },
5435
5440
  React__default.createElement(Title, null, title),
5436
- React__default.createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), onChange: setSearch, placeholder: filterPlaceholder, autoFocus: true }),
5441
+ React__default.createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), initialValue: initialSearch, onChange: setSearch, placeholder: filterPlaceholder, autoFocus: true }),
5437
5442
  React__default.createElement(SettingsMenu, { ref: menuRef, items: menu, onChange: handlePageChange, activeItemId: activePage }))),
5438
5443
  React__default.createElement("div", { className: b$6('page') }, renderPageContent())));
5439
5444
  }
@@ -5446,9 +5451,9 @@ Settings.Page = function SettingsPage({ children }) {
5446
5451
  Settings.Section = function SettingsSection({ children }) {
5447
5452
  return React__default.createElement(React__default.Fragment, null, children);
5448
5453
  };
5449
- Settings.Item = function SettingsItem({ title, children, align = 'center', withBadge, renderTitleComponent = identity_1, mode, description, }) {
5454
+ Settings.Item = function SettingsItem({ title, highlightedTitle, children, align = 'center', withBadge, renderTitleComponent = identity_1, mode, description, }) {
5450
5455
  const { renderRightAdornment, showRightAdornmentOnHover } = useSettingsContext();
5451
- const titleNode = (React__default.createElement("span", { className: b$6('item-title', { badge: withBadge }) }, renderTitleComponent(title)));
5456
+ const titleNode = (React__default.createElement("span", { className: b$6('item-title', { badge: withBadge }) }, renderTitleComponent(highlightedTitle)));
5452
5457
  return (React__default.createElement("div", { className: b$6('item', { align, mode }) },
5453
5458
  React__default.createElement("label", { className: b$6('item-heading') },
5454
5459
  renderRightAdornment ? (React__default.createElement(Flex, { className: b$6('item-title-wrapper'), gap: 3 },