@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/cjs/index.js
CHANGED
|
@@ -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("
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
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
|
|
5119
|
-
const
|
|
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), {
|
|
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(
|
|
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 },
|