@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.
- package/build/cjs/components/Settings/Settings.d.ts +3 -1
- package/build/cjs/components/Settings/SettingsSearch/SettingsSearch.d.ts +2 -1
- package/build/cjs/index.js +39 -34
- package/build/cjs/index.js.map +1 -1
- package/build/esm/components/Settings/Settings.d.ts +3 -1
- package/build/esm/components/Settings/SettingsSearch/SettingsSearch.d.ts +2 -1
- package/build/esm/index.js +39 -34
- package/build/esm/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -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 {};
|
package/build/esm/index.js
CHANGED
|
@@ -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(
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
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
|
|
5092
|
-
const
|
|
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), {
|
|
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(
|
|
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 },
|