@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 {};
@@ -1204,29 +1204,30 @@ const Item$1 = (props) => {
1204
1204
  React__default["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);
1205
1205
  };
1206
1206
  const makeNode = ({ icon: iconEl, title: titleEl }) => {
1207
- const createdNode = (React__default["default"].createElement("div", { className: b$n({ type, current, compact }, className), ref: ref, onClick: (event) => {
1208
- if (collapsedItem) {
1209
- /**
1210
- * If we call onItemClick for collapsedItem then:
1211
- * - User get unexpected item in onItemClick callback
1212
- * - onClosePanel calls twice for each popuped item, as result it will prevent opening of panelItems
1213
- */
1214
- toggleOpen(!open);
1215
- }
1216
- else {
1217
- onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item, false, event);
1218
- }
1219
- }, onClickCapture: onItemClickCapture, onMouseEnter: () => {
1220
- if (!compact) {
1221
- onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter();
1222
- }
1223
- }, onMouseLeave: () => {
1224
- if (!compact) {
1225
- onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave();
1226
- }
1227
- } },
1228
- React__default["default"].createElement("div", { className: b$n('icon-place'), ref: highlightedRef }, makeIconNode(iconEl)),
1229
- React__default["default"].createElement("div", { className: b$n('title'), title: typeof item.title === 'string' ? item.title : undefined }, titleEl),
1207
+ const createdNode = (React__default["default"].createElement(React__default["default"].Fragment, null,
1208
+ React__default["default"].createElement("div", { className: b$n({ type, current, compact }, className), ref: ref, onClick: (event) => {
1209
+ if (collapsedItem) {
1210
+ /**
1211
+ * If we call onItemClick for collapsedItem then:
1212
+ * - User get unexpected item in onItemClick callback
1213
+ * - onClosePanel calls twice for each popuped item, as result it will prevent opening of panelItems
1214
+ */
1215
+ toggleOpen(!open);
1216
+ }
1217
+ else {
1218
+ onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item, false, event);
1219
+ }
1220
+ }, onClickCapture: onItemClickCapture, onMouseEnter: () => {
1221
+ if (!compact) {
1222
+ onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter();
1223
+ }
1224
+ }, onMouseLeave: () => {
1225
+ if (!compact) {
1226
+ onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave();
1227
+ }
1228
+ } },
1229
+ React__default["default"].createElement("div", { className: b$n('icon-place'), ref: highlightedRef }, makeIconNode(iconEl)),
1230
+ React__default["default"].createElement("div", { className: b$n('title'), title: typeof item.title === 'string' ? item.title : undefined }, titleEl)),
1230
1231
  renderPopupContent && Boolean(anchorRef === null || anchorRef === void 0 ? void 0 : anchorRef.current) && (React__default["default"].createElement(uikit.Popup, { contentClassName: b$n('popup'), open: popupVisible, keepMounted: popupKeepMounted, placement: popupPlacement, offset: popupOffset, anchorRef: anchorRef, onClose: onClose }, renderPopupContent()))));
1231
1232
  return item.link ? (React__default["default"].createElement("a", { href: item.link, className: b$n('link') }, createdNode)) : (createdNode);
1232
1233
  };
@@ -5114,11 +5115,15 @@ function escapeStringForRegExp(input) {
5114
5115
  }
5115
5116
 
5116
5117
  const b$9 = block('settings-search');
5117
- function SettingsSearch({ className, onChange, debounce = 200, inputRef, inputSize, placeholder, autoFocus = true, }) {
5118
- const onChangeStable = useStableCallback(onChange);
5119
- const handleUpdate = React__default["default"].useCallback(debounce_1(onChangeStable, debounce), [debounce]);
5118
+ function SettingsSearch({ className, initialValue, onChange, debounce = 200, inputRef, inputSize, placeholder, autoFocus = true, }) {
5119
+ const [value, setValue] = React__default["default"].useState(initialValue !== null && initialValue !== void 0 ? initialValue : '');
5120
+ const onChangeDebounced = useStableCallback(debounce_1(onChange, debounce));
5121
+ const handleUpdate = useStableCallback((updated) => {
5122
+ setValue(updated);
5123
+ onChangeDebounced(updated);
5124
+ });
5120
5125
  return (React__default["default"].createElement("div", { className: b$9(null, className) },
5121
- React__default["default"].createElement(uikit.TextInput, { controlRef: inputRef, hasClear: true, autoFocus: autoFocus, size: inputSize, placeholder: placeholder, onUpdate: handleUpdate })));
5126
+ React__default["default"].createElement(uikit.TextInput, { value: value, controlRef: inputRef, hasClear: true, autoFocus: autoFocus, size: inputSize, placeholder: placeholder, onUpdate: handleUpdate })));
5122
5127
  }
5123
5128
 
5124
5129
  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}";
@@ -5390,9 +5395,9 @@ const getPageTitleById = (menu, activePage) => {
5390
5395
  }
5391
5396
  return '';
5392
5397
  };
5393
- 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, }) {
5398
+ 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, }) {
5394
5399
  var _a, _b;
5395
- const [search, setSearch] = React__default["default"].useState('');
5400
+ const [search, setSearch] = React__default["default"].useState(initialSearch !== null && initialSearch !== void 0 ? initialSearch : '');
5396
5401
  const { menu, pages } = getSettingsFromChildren(children, search);
5397
5402
  const pageKeys = Object.keys(pages);
5398
5403
  const [selectedPage, setCurrentPage] = React__default["default"].useState(initialPage && pageKeys.includes(initialPage) ? initialPage : undefined);
@@ -5441,13 +5446,13 @@ function SettingsContent({ initialPage, children, renderNotFound, title = i18n$1
5441
5446
  section.showTitle && (React__default["default"].createElement("h3", { className: b$6('section-heading') }, section.title)),
5442
5447
  section.header &&
5443
5448
  (isMobile ? (React__default["default"].createElement("div", { className: b$6('section-subheader') }, section.header)) : (section.header)),
5444
- section.items.map(({ hidden, title, element }) => hidden ? null : (React__default["default"].createElement("div", { key: title, className: b$6('section-item') }, React__default["default"].cloneElement(element, Object.assign(Object.assign({}, element.props), { title: search && title
5449
+ section.items.map(({ hidden, title, element }) => hidden ? null : (React__default["default"].createElement("div", { key: title, className: b$6('section-item') }, React__default["default"].cloneElement(element, Object.assign(Object.assign({}, element.props), { highlightedTitle: search && title
5445
5450
  ? prepareTitle(title, search)
5446
5451
  : title })))))))))));
5447
5452
  };
5448
5453
  return (React__default["default"].createElement("div", { className: b$6({ view }) },
5449
5454
  isMobile ? (React__default["default"].createElement(React__default["default"].Fragment, null,
5450
- React__default["default"].createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), onChange: setSearch, autoFocus: false, inputSize: 'l' }),
5455
+ React__default["default"].createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), initialValue: initialSearch, onChange: setSearch, autoFocus: false, inputSize: 'l' }),
5451
5456
  React__default["default"].createElement(SettingsMenuMobile, { items: menu, onChange: handlePageChange, activeItemId: activePage, className: b$6('tabs') }))) : (React__default["default"].createElement("div", { className: b$6('menu'), onClick: () => {
5452
5457
  if (searchInputRef.current) {
5453
5458
  searchInputRef.current.focus();
@@ -5460,7 +5465,7 @@ function SettingsContent({ initialPage, children, renderNotFound, title = i18n$1
5460
5465
  }
5461
5466
  } },
5462
5467
  React__default["default"].createElement(Title, null, title),
5463
- React__default["default"].createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), onChange: setSearch, placeholder: filterPlaceholder, autoFocus: true }),
5468
+ React__default["default"].createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), initialValue: initialSearch, onChange: setSearch, placeholder: filterPlaceholder, autoFocus: true }),
5464
5469
  React__default["default"].createElement(SettingsMenu, { ref: menuRef, items: menu, onChange: handlePageChange, activeItemId: activePage }))),
5465
5470
  React__default["default"].createElement("div", { className: b$6('page') }, renderPageContent())));
5466
5471
  }
@@ -5473,9 +5478,9 @@ Settings.Page = function SettingsPage({ children }) {
5473
5478
  Settings.Section = function SettingsSection({ children }) {
5474
5479
  return React__default["default"].createElement(React__default["default"].Fragment, null, children);
5475
5480
  };
5476
- Settings.Item = function SettingsItem({ title, children, align = 'center', withBadge, renderTitleComponent = identity_1, mode, description, }) {
5481
+ Settings.Item = function SettingsItem({ title, highlightedTitle, children, align = 'center', withBadge, renderTitleComponent = identity_1, mode, description, }) {
5477
5482
  const { renderRightAdornment, showRightAdornmentOnHover } = useSettingsContext();
5478
- const titleNode = (React__default["default"].createElement("span", { className: b$6('item-title', { badge: withBadge }) }, renderTitleComponent(title)));
5483
+ const titleNode = (React__default["default"].createElement("span", { className: b$6('item-title', { badge: withBadge }) }, renderTitleComponent(highlightedTitle)));
5479
5484
  return (React__default["default"].createElement("div", { className: b$6('item', { align, mode }) },
5480
5485
  React__default["default"].createElement("label", { className: b$6('item-heading') },
5481
5486
  renderRightAdornment ? (React__default["default"].createElement(uikit.Flex, { className: b$6('item-title-wrapper'), gap: 3 },