@gravity-ui/blog-constructor 9.1.2-alpha.0 → 9.1.2-alpha.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/FeedHeader/components/Controls/Controls.css +14 -60
- package/build/cjs/components/FeedHeader/components/Controls/Controls.js +3 -38
- package/build/cjs/components/FeedHeader/components/Controls/Controls.js.map +1 -1
- package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.d.ts +2 -3
- package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js +4 -1
- package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js.map +1 -1
- package/build/cjs/components/FeedHeader/components/Filters/Filter.css +53 -0
- package/build/cjs/components/FeedHeader/components/Filters/Filter.d.ts +8 -0
- package/build/cjs/components/FeedHeader/components/Filters/Filter.js +61 -0
- package/build/cjs/components/FeedHeader/components/Filters/Filter.js.map +1 -0
- package/build/cjs/components/FeedHeader/components/{Controls → Filters}/customRenders.d.ts +3 -1
- package/build/cjs/components/FeedHeader/components/{Controls → Filters}/customRenders.js +4 -4
- package/build/cjs/components/FeedHeader/components/Filters/customRenders.js.map +1 -0
- package/build/cjs/components/Search/Search.css +1 -1
- package/build/cjs/models/common.d.ts +20 -8
- package/build/cjs/models/common.js.map +1 -1
- package/build/cjs/utils/common.js +0 -5
- package/build/cjs/utils/common.js.map +1 -1
- package/build/esm/components/FeedHeader/components/Controls/Controls.css +14 -60
- package/build/esm/components/FeedHeader/components/Controls/Controls.js +5 -40
- package/build/esm/components/FeedHeader/components/Controls/Controls.js.map +1 -1
- package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.d.ts +2 -3
- package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js +5 -2
- package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js.map +1 -1
- package/build/esm/components/FeedHeader/components/Filters/Filter.css +53 -0
- package/build/esm/components/FeedHeader/components/Filters/Filter.d.ts +9 -0
- package/build/esm/components/FeedHeader/components/Filters/Filter.js +57 -0
- package/build/esm/components/FeedHeader/components/Filters/Filter.js.map +1 -0
- package/build/esm/components/FeedHeader/components/{Controls → Filters}/customRenders.d.ts +3 -2
- package/build/esm/components/FeedHeader/components/{Controls → Filters}/customRenders.js +4 -5
- package/build/esm/components/FeedHeader/components/Filters/customRenders.js.map +1 -0
- package/build/esm/components/Search/Search.css +1 -1
- package/build/esm/models/common.d.ts +20 -8
- package/build/esm/models/common.js.map +1 -1
- package/build/esm/utils/common.js +0 -5
- package/build/esm/utils/common.js.map +1 -1
- package/package.json +1 -1
- package/server/models/common.d.ts +20 -8
- package/build/cjs/components/FeedHeader/components/Controls/customRenders.js.map +0 -1
- package/build/esm/components/FeedHeader/components/Controls/customRenders.js.map +0 -1
|
@@ -23,66 +23,6 @@ unpredictable css rules order in build */
|
|
|
23
23
|
width: 100%;
|
|
24
24
|
max-width: 100%;
|
|
25
25
|
}
|
|
26
|
-
.bc-feed-controls__select {
|
|
27
|
-
width: 100%;
|
|
28
|
-
}
|
|
29
|
-
.bc-feed-controls__popup.bc-feed-controls__popup {
|
|
30
|
-
max-height: 500px;
|
|
31
|
-
border-radius: 12px;
|
|
32
|
-
}
|
|
33
|
-
.bc-feed-controls__popup.bc-feed-controls__popup .g-select-list::-webkit-scrollbar {
|
|
34
|
-
display: none;
|
|
35
|
-
}
|
|
36
|
-
.bc-feed-controls__popup.bc-feed-controls__popup .g-select-list .g-list {
|
|
37
|
-
max-height: calc(500px - var(--g-text-body-3-line-height) - 12px);
|
|
38
|
-
}
|
|
39
|
-
.bc-feed-controls__popup.bc-feed-controls__popup .g-list__item {
|
|
40
|
-
margin: 4px;
|
|
41
|
-
border-radius: 8px;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
.bc-feed-controls__popup_isMobile .bc-feed-controls__popup-filter {
|
|
45
|
-
position: relative;
|
|
46
|
-
border: none;
|
|
47
|
-
}
|
|
48
|
-
.bc-feed-controls__popup_isMobile .bc-feed-controls__popup-filter::before {
|
|
49
|
-
content: "";
|
|
50
|
-
position: absolute;
|
|
51
|
-
left: 50%;
|
|
52
|
-
bottom: 0px;
|
|
53
|
-
border-bottom: 2px solid var(--g-color-line-generic);
|
|
54
|
-
border-bottom-right-radius: 0;
|
|
55
|
-
border-bottom-left-radius: 0;
|
|
56
|
-
width: 100%;
|
|
57
|
-
height: 2px;
|
|
58
|
-
transform: translateX(-50%);
|
|
59
|
-
}
|
|
60
|
-
.bc-feed-controls__popup-filter {
|
|
61
|
-
font-size: var(--g-text-body-2-font-size);
|
|
62
|
-
line-height: var(--g-text-body-2-line-height);
|
|
63
|
-
padding: 4px 12px;
|
|
64
|
-
border: none;
|
|
65
|
-
border-bottom: 1px solid var(--g-color-line-generic);
|
|
66
|
-
border-bottom-right-radius: 0;
|
|
67
|
-
border-bottom-left-radius: 0;
|
|
68
|
-
}
|
|
69
|
-
.bc-feed-controls__select:hover {
|
|
70
|
-
width: 100%;
|
|
71
|
-
}
|
|
72
|
-
.bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly {
|
|
73
|
-
--g-button-background-color: var(--pc-monochrome-button-background-color);
|
|
74
|
-
--g-button-background-color-hover: var(--pc-monochrome-button-background-color-hover);
|
|
75
|
-
}
|
|
76
|
-
.bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly, .bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly:link, .bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly:visited, .bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly:active, .bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly:focus {
|
|
77
|
-
color: var(--pc-monochrome-button-color);
|
|
78
|
-
}
|
|
79
|
-
.bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly:hover {
|
|
80
|
-
color: var(--pc-monochrome-button-color);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
.bc-feed-controls__saved-only-button_savedOnly:focus {
|
|
84
|
-
color: var(--g-color-base-background);
|
|
85
|
-
}
|
|
86
26
|
.bc-feed-controls__filter-item {
|
|
87
27
|
margin-right: 8px;
|
|
88
28
|
margin-left: 8px;
|
|
@@ -100,6 +40,20 @@ unpredictable css rules order in build */
|
|
|
100
40
|
min-width: auto;
|
|
101
41
|
flex-grow: 0;
|
|
102
42
|
}
|
|
43
|
+
.bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly {
|
|
44
|
+
--g-button-background-color: var(--pc-monochrome-button-background-color);
|
|
45
|
+
--g-button-background-color-hover: var(--pc-monochrome-button-background-color-hover);
|
|
46
|
+
}
|
|
47
|
+
.bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly, .bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly:link, .bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly:visited, .bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly:active, .bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly:focus {
|
|
48
|
+
color: var(--pc-monochrome-button-color);
|
|
49
|
+
}
|
|
50
|
+
.bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly:hover {
|
|
51
|
+
color: var(--pc-monochrome-button-color);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.bc-feed-controls__saved-only-button_savedOnly:focus {
|
|
55
|
+
color: var(--g-color-base-background);
|
|
56
|
+
}
|
|
103
57
|
.bc-feed-controls__icon {
|
|
104
58
|
color: var(--g-color-base-brand);
|
|
105
59
|
}
|
|
@@ -8,23 +8,20 @@ const icons_1 = require("@gravity-ui/icons");
|
|
|
8
8
|
const page_constructor_1 = require("@gravity-ui/page-constructor");
|
|
9
9
|
const uikit_1 = require("@gravity-ui/uikit");
|
|
10
10
|
const LikesContext_1 = require("../../../../contexts/LikesContext.js");
|
|
11
|
-
const MobileContext_1 = require("../../../../contexts/MobileContext.js");
|
|
12
11
|
const i18n_1 = require("../../../../i18n/index.js");
|
|
13
12
|
const common_1 = require("../../../../models/common.js");
|
|
14
13
|
const cn_1 = require("../../../../utils/cn.js");
|
|
15
14
|
const Search_1 = require("../../../Search/Search.js");
|
|
16
|
-
const
|
|
15
|
+
const Filter_1 = require("../Filters/Filter.js");
|
|
17
16
|
const b = (0, cn_1.block)('feed-controls');
|
|
18
17
|
const ICON_SIZE = 16;
|
|
19
18
|
const DEFAULT_PAGE = 1;
|
|
20
|
-
const VIRTUALIZATION_THRESHOLD = 1000;
|
|
21
19
|
const Controls = ({ handleLoadData, filters = [], queryParams, title = (0, i18n_1.i18n)(i18n_1.Keyset.Title), }) => {
|
|
22
20
|
const { hasLikes } = React.useContext(LikesContext_1.LikesContext);
|
|
23
21
|
const handleAnalyticsSaveOnly = (0, page_constructor_1.useAnalytics)(common_1.DefaultEventNames.SaveOnly);
|
|
24
22
|
const { savedOnly: savedOnlyInitial, search: searchInitial } = queryParams || {};
|
|
25
23
|
const [savedOnly, setSavedOnly] = React.useState(savedOnlyInitial === 'true');
|
|
26
24
|
const [search, setSearch] = React.useState(searchInitial);
|
|
27
|
-
const isMobile = React.useContext(MobileContext_1.MobileContext);
|
|
28
25
|
const handleSavedOnly = () => {
|
|
29
26
|
handleAnalyticsSaveOnly();
|
|
30
27
|
setSavedOnly(!savedOnly);
|
|
@@ -44,40 +41,8 @@ const Controls = ({ handleLoadData, filters = [], queryParams, title = (0, i18n_
|
|
|
44
41
|
query: { search: searchValue, page: DEFAULT_PAGE },
|
|
45
42
|
});
|
|
46
43
|
}, [handleLoadData]);
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
if (filter.multiple) {
|
|
50
|
-
query[filter.queryParamName] = selectedValues.join(',');
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
const isEmpty = selectedValues.some((v) => v === 'empty');
|
|
54
|
-
query[filter.queryParamName] = isEmpty ? '' : selectedValues[0];
|
|
55
|
-
}
|
|
56
|
-
handleLoadData({ page: DEFAULT_PAGE, query });
|
|
57
|
-
};
|
|
58
|
-
return ((0, jsx_runtime_1.jsx)(uikit_1.MobileProvider, { mobile: false, children: (0, jsx_runtime_1.jsxs)("div", { className: b('header'), children: [(0, jsx_runtime_1.jsx)("h1", { className: b('header-item', { title: true }), children: title }), (0, jsx_runtime_1.jsxs)("div", { className: b('header-item', { filters: true }), children: [(0, jsx_runtime_1.jsx)("div", { className: b('filter-item'), children: (0, jsx_runtime_1.jsx)(Search_1.Search, { className: b('search'), placeholder: (0, i18n_1.i18n)(i18n_1.Keyset.Search), initialValue: search && typeof search === 'string' ? search : '', onSubmit: handleSearch }) }), filters.map((filter) => {
|
|
59
|
-
var _a, _b;
|
|
60
|
-
const initialRaw = queryParams === null || queryParams === void 0 ? void 0 : queryParams[filter.queryParamName];
|
|
61
|
-
let defaultValue;
|
|
62
|
-
if (filter.multiple) {
|
|
63
|
-
defaultValue = initialRaw ? initialRaw.split(',') : [];
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
defaultValue = [initialRaw];
|
|
67
|
-
}
|
|
68
|
-
const itemsWithEmpty = filter.multiple
|
|
69
|
-
? filter.items
|
|
70
|
-
: [
|
|
71
|
-
{ value: 'empty', content: filter.allLabel },
|
|
72
|
-
...filter.items,
|
|
73
|
-
];
|
|
74
|
-
return ((0, jsx_runtime_1.jsx)("div", { className: b('filter-item'), children: (0, jsx_runtime_1.jsx)(uikit_1.Select, { className: b('select'), size: "xl", multiple: filter.multiple, filterable: filter.filterable, hasClear: (_a = filter.hasClear) !== null && _a !== void 0 ? _a : filter.multiple, disablePortal: true, options: itemsWithEmpty, defaultValue: defaultValue, popupClassName: b('popup', { isMobile }), onUpdate: makeHandleFilterSelect(filter), placeholder: (_b = filter.placeholder) !== null && _b !== void 0 ? _b : filter.allLabel, renderControl: (0, customRenders_1.renderSwitcher)({
|
|
75
|
-
initial: defaultValue,
|
|
76
|
-
list: itemsWithEmpty,
|
|
77
|
-
defaultLabel: filter.allLabel,
|
|
78
|
-
qa: filter.qa,
|
|
79
|
-
}), virtualizationThreshold: VIRTUALIZATION_THRESHOLD, renderOption: customRenders_1.renderOption, renderFilter: filter.filterable ? customRenders_1.renderFilter : undefined }) }, filter.queryParamName));
|
|
80
|
-
}), hasLikes ? ((0, jsx_runtime_1.jsx)("div", { className: b('filter-item', { 'width-auto': true }), children: (0, jsx_runtime_1.jsxs)(uikit_1.Button, { view: 'outlined', className: b('saved-only-button', { savedOnly }), size: "xl", onClick: handleSavedOnly, selected: savedOnly, children: [(0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Bookmark, size: ICON_SIZE, className: b('icon', { savedOnly }) }), (0, i18n_1.i18n)(i18n_1.Keyset.ActionSavedOnly)] }) })) : null] })] }) }));
|
|
44
|
+
const handleFilterSelect = React.useCallback((query) => handleLoadData({ page: DEFAULT_PAGE, query: Object.assign({ page: DEFAULT_PAGE }, query) }), [handleLoadData]);
|
|
45
|
+
return ((0, jsx_runtime_1.jsx)(uikit_1.MobileProvider, { mobile: false, children: (0, jsx_runtime_1.jsxs)("div", { className: b('header'), children: [(0, jsx_runtime_1.jsx)("h1", { className: b('header-item', { title: true }), children: title }), (0, jsx_runtime_1.jsxs)("div", { className: b('header-item', { filters: true }), children: [(0, jsx_runtime_1.jsx)("div", { className: b('filter-item'), children: (0, jsx_runtime_1.jsx)(Search_1.Search, { className: b('search'), placeholder: (0, i18n_1.i18n)(i18n_1.Keyset.Search), initialValue: search && typeof search === 'string' ? search : '', onSubmit: handleSearch }) }), filters.map((filter) => ((0, jsx_runtime_1.jsx)(Filter_1.Filter, { filter: filter, initialValue: queryParams === null || queryParams === void 0 ? void 0 : queryParams[filter.queryParamName], onSelect: handleFilterSelect, className: b('filter-item') }, filter.queryParamName))), hasLikes ? ((0, jsx_runtime_1.jsx)("div", { className: b('filter-item', { 'width-auto': true }), children: (0, jsx_runtime_1.jsxs)(uikit_1.Button, { view: 'outlined', className: b('saved-only-button', { savedOnly }), size: "xl", onClick: handleSavedOnly, selected: savedOnly, children: [(0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Bookmark, size: ICON_SIZE, className: b('icon', { savedOnly }) }), (0, i18n_1.i18n)(i18n_1.Keyset.ActionSavedOnly)] }) })) : null] })] }) }));
|
|
81
46
|
};
|
|
82
47
|
exports.Controls = Controls;
|
|
83
48
|
//# sourceMappingURL=Controls.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Controls.js","sourceRoot":"../../../../../../src","sources":["components/FeedHeader/components/Controls/Controls.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport {Bookmark} from '@gravity-ui/icons';\nimport {useAnalytics} from '@gravity-ui/page-constructor';\nimport {Button, Icon, MobileProvider, Select} from '@gravity-ui/uikit';\n\nimport {LikesContext} from '../../../../contexts/LikesContext';\nimport {MobileContext} from '../../../../contexts/MobileContext';\nimport {Keyset, i18n} from '../../../../i18n';\nimport {\n DefaultEventNames,\n FetchArgs,\n FilterConfig,\n Query,\n SelectItem,\n} from '../../../../models/common';\nimport {block} from '../../../../utils/cn';\nimport {Search} from '../../../Search/Search';\n\nimport {renderFilter, renderOption, renderSwitcher} from './customRenders';\n\nimport './Controls.scss';\n\nconst b = block('feed-controls');\n\nexport type ControlsProps = {\n handleLoadData: (props: FetchArgs) => void;\n filters?: FilterConfig[];\n queryParams: Query;\n title?: string;\n};\n\nconst ICON_SIZE = 16;\nconst DEFAULT_PAGE = 1;\nconst VIRTUALIZATION_THRESHOLD = 1000;\n\nexport const Controls = ({\n handleLoadData,\n filters = [],\n queryParams,\n title = i18n(Keyset.Title),\n}: ControlsProps) => {\n const {hasLikes} = React.useContext(LikesContext);\n const handleAnalyticsSaveOnly = useAnalytics(DefaultEventNames.SaveOnly);\n\n const {savedOnly: savedOnlyInitial, search: searchInitial} = queryParams || {};\n\n const [savedOnly, setSavedOnly] = React.useState<boolean>(savedOnlyInitial === 'true');\n const [search, setSearch] = React.useState<string>(searchInitial as string);\n\n const isMobile = React.useContext(MobileContext);\n\n const handleSavedOnly = () => {\n handleAnalyticsSaveOnly();\n setSavedOnly(!savedOnly);\n handleLoadData({\n page: DEFAULT_PAGE,\n query: {\n savedOnly: savedOnly ? '' : 'true',\n search: '',\n page: DEFAULT_PAGE,\n },\n });\n };\n\n const handleSearch = React.useCallback(\n (searchValue: string) => {\n setSearch(searchValue);\n\n handleLoadData({\n page: DEFAULT_PAGE,\n query: {search: searchValue, page: DEFAULT_PAGE},\n });\n },\n [handleLoadData],\n );\n\n const makeHandleFilterSelect = (filter: FilterConfig) => (selectedValues: string[]) => {\n const query: Query = {page: DEFAULT_PAGE};\n\n if (filter.multiple) {\n query[filter.queryParamName] = selectedValues.join(',');\n } else {\n const isEmpty = selectedValues.some((v) => v === 'empty');\n query[filter.queryParamName] = isEmpty ? '' : selectedValues[0];\n }\n\n handleLoadData({page: DEFAULT_PAGE, query});\n };\n\n return (\n <MobileProvider mobile={false}>\n <div className={b('header')}>\n <h1 className={b('header-item', {title: true})}>{title}</h1>\n <div className={b('header-item', {filters: true})}>\n <div className={b('filter-item')}>\n <Search\n className={b('search')}\n placeholder={i18n(Keyset.Search)}\n initialValue={search && typeof search === 'string' ? search : ''}\n onSubmit={handleSearch}\n />\n </div>\n\n {filters.map((filter) => {\n const initialRaw = queryParams?.[filter.queryParamName];\n\n let defaultValue: string[];\n if (filter.multiple) {\n defaultValue = initialRaw ? (initialRaw as string).split(',') : [];\n } else {\n defaultValue = [initialRaw] as string[];\n }\n\n const itemsWithEmpty: SelectItem[] = filter.multiple\n ? filter.items\n : [\n {value: 'empty', content: filter.allLabel} as SelectItem,\n ...filter.items,\n ];\n\n return (\n <div key={filter.queryParamName} className={b('filter-item')}>\n <Select\n className={b('select')}\n size=\"xl\"\n multiple={filter.multiple}\n filterable={filter.filterable}\n hasClear={filter.hasClear ?? filter.multiple}\n disablePortal\n options={itemsWithEmpty}\n defaultValue={defaultValue}\n popupClassName={b('popup', {isMobile})}\n onUpdate={makeHandleFilterSelect(filter)}\n placeholder={filter.placeholder ?? filter.allLabel}\n renderControl={renderSwitcher({\n initial: defaultValue,\n list: itemsWithEmpty,\n defaultLabel: filter.allLabel,\n qa: filter.qa,\n })}\n virtualizationThreshold={VIRTUALIZATION_THRESHOLD}\n renderOption={renderOption}\n renderFilter={filter.filterable ? renderFilter : undefined}\n />\n </div>\n );\n })}\n\n {hasLikes ? (\n <div className={b('filter-item', {'width-auto': true})}>\n <Button\n view={'outlined'}\n className={b('saved-only-button', {savedOnly})}\n size=\"xl\"\n onClick={handleSavedOnly}\n selected={savedOnly}\n >\n <Icon\n data={Bookmark}\n size={ICON_SIZE}\n className={b('icon', {savedOnly})}\n />\n {i18n(Keyset.ActionSavedOnly)}\n </Button>\n </div>\n ) : null}\n </div>\n </div>\n </MobileProvider>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"Controls.js","sourceRoot":"../../../../../../src","sources":["components/FeedHeader/components/Controls/Controls.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport {Bookmark} from '@gravity-ui/icons';\nimport {useAnalytics} from '@gravity-ui/page-constructor';\nimport {Button, Icon, MobileProvider} from '@gravity-ui/uikit';\n\nimport {LikesContext} from '../../../../contexts/LikesContext';\nimport {Keyset, i18n} from '../../../../i18n';\nimport {DefaultEventNames, FetchArgs, FilterConfig, Query} from '../../../../models/common';\nimport {block} from '../../../../utils/cn';\nimport {Search} from '../../../Search/Search';\nimport {Filter} from '../Filters/Filter';\n\nimport './Controls.scss';\n\nconst b = block('feed-controls');\n\nexport type ControlsProps = {\n handleLoadData: (props: FetchArgs) => void;\n filters?: FilterConfig[];\n queryParams: Query;\n title?: string;\n};\n\nconst ICON_SIZE = 16;\nconst DEFAULT_PAGE = 1;\n\nexport const Controls = ({\n handleLoadData,\n filters = [],\n queryParams,\n title = i18n(Keyset.Title),\n}: ControlsProps) => {\n const {hasLikes} = React.useContext(LikesContext);\n const handleAnalyticsSaveOnly = useAnalytics(DefaultEventNames.SaveOnly);\n\n const {savedOnly: savedOnlyInitial, search: searchInitial} = queryParams || {};\n\n const [savedOnly, setSavedOnly] = React.useState<boolean>(savedOnlyInitial === 'true');\n const [search, setSearch] = React.useState<string>(searchInitial as string);\n\n const handleSavedOnly = () => {\n handleAnalyticsSaveOnly();\n setSavedOnly(!savedOnly);\n handleLoadData({\n page: DEFAULT_PAGE,\n query: {\n savedOnly: savedOnly ? '' : 'true',\n search: '',\n page: DEFAULT_PAGE,\n },\n });\n };\n\n const handleSearch = React.useCallback(\n (searchValue: string) => {\n setSearch(searchValue);\n\n handleLoadData({\n page: DEFAULT_PAGE,\n query: {search: searchValue, page: DEFAULT_PAGE},\n });\n },\n [handleLoadData],\n );\n\n const handleFilterSelect = React.useCallback(\n (query: Query) =>\n handleLoadData({page: DEFAULT_PAGE, query: {page: DEFAULT_PAGE, ...query}}),\n [handleLoadData],\n );\n\n return (\n <MobileProvider mobile={false}>\n <div className={b('header')}>\n <h1 className={b('header-item', {title: true})}>{title}</h1>\n <div className={b('header-item', {filters: true})}>\n <div className={b('filter-item')}>\n <Search\n className={b('search')}\n placeholder={i18n(Keyset.Search)}\n initialValue={search && typeof search === 'string' ? search : ''}\n onSubmit={handleSearch}\n />\n </div>\n\n {filters.map((filter) => (\n <Filter\n key={filter.queryParamName}\n filter={filter}\n initialValue={queryParams?.[filter.queryParamName]}\n onSelect={handleFilterSelect}\n className={b('filter-item')}\n />\n ))}\n\n {hasLikes ? (\n <div className={b('filter-item', {'width-auto': true})}>\n <Button\n view={'outlined'}\n className={b('saved-only-button', {savedOnly})}\n size=\"xl\"\n onClick={handleSavedOnly}\n selected={savedOnly}\n >\n <Icon\n data={Bookmark}\n size={ICON_SIZE}\n className={b('icon', {savedOnly})}\n />\n {i18n(Keyset.ActionSavedOnly)}\n </Button>\n </div>\n ) : null}\n </div>\n </div>\n </MobileProvider>\n );\n};\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { SelectProps } from '@gravity-ui/uikit';
|
|
2
|
-
import { SelectItem } from "../../../../models/common.js";
|
|
1
|
+
import { SelectOptions, SelectProps } from '@gravity-ui/uikit';
|
|
3
2
|
type RenderControlParameters = Partial<Parameters<Required<SelectProps>['renderControl']>[0]>;
|
|
4
3
|
type TriggerProps = Required<RenderControlParameters>['triggerProps'];
|
|
5
4
|
type A11yKeys = {
|
|
@@ -9,7 +8,7 @@ type RenderControlA11yProps = Pick<TriggerProps, A11yKeys>;
|
|
|
9
8
|
export type CustomSwitcherProps = {
|
|
10
9
|
initial: (string | number | null)[];
|
|
11
10
|
defaultLabel: string;
|
|
12
|
-
list:
|
|
11
|
+
list: SelectOptions;
|
|
13
12
|
controlRef: RenderControlParameters['ref'];
|
|
14
13
|
a11yProps: RenderControlA11yProps;
|
|
15
14
|
qa?: string;
|
|
@@ -11,7 +11,10 @@ const b = (0, cn_1.block)('feed-custom-switcher');
|
|
|
11
11
|
const ICON_SIZE = 12;
|
|
12
12
|
const CustomSwitcher = ({ id, disabled, type, initial, defaultLabel, list, triggerProps, controlRef, renderClear, a11yProps, qa, }) => {
|
|
13
13
|
const itemsNames = React.useMemo(() => {
|
|
14
|
-
const
|
|
14
|
+
const flatList = list.length > 0 && 'options' in list[0]
|
|
15
|
+
? list.flatMap((g) => { var _a; return (_a = g.options) !== null && _a !== void 0 ? _a : []; })
|
|
16
|
+
: list;
|
|
17
|
+
const items = flatList
|
|
15
18
|
.filter((item) => initial.includes(item.value))
|
|
16
19
|
.map((item) => item.content);
|
|
17
20
|
return items.length ? items : [defaultLabel];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomSwitcher.js","sourceRoot":"../../../../../../src","sources":["components/FeedHeader/components/CustomSwitcher/CustomSwitcher.tsx"],"names":[],"mappings":";;;;;AAAA,qDAA+B;AAE/B,6CAAqD;AACrD,
|
|
1
|
+
{"version":3,"file":"CustomSwitcher.js","sourceRoot":"../../../../../../src","sources":["components/FeedHeader/components/CustomSwitcher/CustomSwitcher.tsx"],"names":[],"mappings":";;;;;AAAA,qDAA+B;AAE/B,6CAAqD;AACrD,6CAO2B;AAE3B,gDAA2C;AAI3C,MAAM,CAAC,GAAG,IAAA,UAAK,EAAC,sBAAsB,CAAC,CAAC;AAqBxC,MAAM,SAAS,GAAG,EAAE,CAAC;AAEd,MAAM,cAAc,GAAG,CAAC,EAC3B,EAAE,EACF,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,EACT,EAAE,GACgB,EAAE,EAAE;IACtB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAClC,MAAM,QAAQ,GACV,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC;YACnC,CAAC,CAAE,IAA4B,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,CAAC,CAAC,OAAO,mCAAI,EAAE,CAAA,EAAA,CAAC;YAC/D,CAAC,CAAE,IAAuB,CAAC;QAEnC,MAAM,KAAK,GAAG,QAAQ;aACjB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC9C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAEzC,MAAM,gBAAgB,GAAG,IAAA,iBAAS,GAAE,CAAC;IAErC,OAAO,CACH,iCAAK,SAAS,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,UAA6C,aAEpF,4DACa,EAAE,EACX,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,OAAO,EAC9B,SAAS,EAAE,CAAC,CAAC,yBAAyB,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,EACxD,SAAS,EAAE,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,SAAS,IAC9B,SAAS,uBACI,gBAAgB,IACnC,EACF,gCACI,EAAE,EAAE,gBAAgB,EACpB,SAAS,EAAE,CAAC,CAAC,yBAAyB,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,iCAGvD,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,CAAC,IAAI,CAAC,GACrB,EACL,WAAW;gBACR,WAAW,CAAC;oBACR,UAAU,EAAE,GAAG,EAAE,CAAC,uBAAC,YAAI,IAAC,IAAI,EAAE,aAAK,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,GAAI;iBACjE,CAAC,EACL,UAAU,IAAI,CACX,gCAAK,SAAS,EAAE,CAAC,CAAC,yBAAyB,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,YACxD,UAAU,CAAC,MAAM,GAChB,CACT,EACD,gCAAK,SAAS,EAAE,CAAC,CAAC,yBAAyB,EAAE,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC,YACvD,uBAAC,YAAI,IAAC,IAAI,EAAE,mBAAW,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAI,GAC1E,IACJ,CACT,CAAC;AACN,CAAC,CAAC;AAhEW,QAAA,cAAc,kBAgEzB","sourcesContent":["import * as React from 'react';\n\nimport {ChevronDown, Xmark} from '@gravity-ui/icons';\nimport {\n Icon,\n SelectOption,\n SelectOptionGroup,\n SelectOptions,\n SelectProps,\n useUniqId,\n} from '@gravity-ui/uikit';\n\nimport {block} from '../../../../utils/cn';\n\nimport './CustomSwitcher.scss';\n\nconst b = block('feed-custom-switcher');\n\ntype RenderControlParameters = Partial<Parameters<Required<SelectProps>['renderControl']>[0]>;\ntype TriggerProps = Required<RenderControlParameters>['triggerProps'];\n\ntype A11yKeys = {\n [K in keyof TriggerProps]-?: K extends `aria-${string}` | 'role' ? K : never;\n}[keyof TriggerProps];\n\ntype RenderControlA11yProps = Pick<TriggerProps, A11yKeys>;\n\nexport type CustomSwitcherProps = {\n initial: (string | number | null)[];\n defaultLabel: string;\n list: SelectOptions;\n controlRef: RenderControlParameters['ref'];\n a11yProps: RenderControlA11yProps;\n qa?: string;\n} & Omit<RenderControlParameters, 'ref'> &\n Pick<TriggerProps, 'id' | 'disabled' | 'type'>;\n\nconst ICON_SIZE = 12;\n\nexport const CustomSwitcher = ({\n id,\n disabled,\n type,\n initial,\n defaultLabel,\n list,\n triggerProps,\n controlRef,\n renderClear,\n a11yProps,\n qa,\n}: CustomSwitcherProps) => {\n const itemsNames = React.useMemo(() => {\n const flatList: SelectOption[] =\n list.length > 0 && 'options' in list[0]\n ? (list as SelectOptionGroup[]).flatMap((g) => g.options ?? [])\n : (list as SelectOption[]);\n\n const items = flatList\n .filter((item) => initial.includes(item.value))\n .map((item) => item.content);\n\n return items.length ? items : [defaultLabel];\n }, [defaultLabel, initial, list]);\n const hasCounter = itemsNames.length > 1;\n\n const contentElementId = useUniqId();\n\n return (\n <div className={b('custom-switcher')} ref={controlRef as React.LegacyRef<HTMLDivElement>}>\n {/* eslint-disable-next-line jsx-a11y/role-supports-aria-props */}\n <button\n data-qa={qa}\n id={id}\n disabled={disabled}\n type={type}\n onClick={triggerProps?.onClick}\n className={b('custom-switcher-element', {overlay: true})}\n onKeyDown={triggerProps?.onKeyDown}\n {...a11yProps}\n aria-labelledby={contentElementId}\n />\n <div\n id={contentElementId}\n className={b('custom-switcher-element', {content: true})}\n aria-hidden\n >\n {itemsNames?.join(', ')}\n </div>\n {renderClear &&\n renderClear({\n renderIcon: () => <Icon data={Xmark} className={b('clear')} />,\n })}\n {hasCounter && (\n <div className={b('custom-switcher-element', {counter: true})}>\n {itemsNames.length}\n </div>\n )}\n <div className={b('custom-switcher-element', {arrow: true})}>\n <Icon data={ChevronDown} size={ICON_SIZE} className={b('switcher-arrow')} />\n </div>\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/* use this for style redefinitions to awoid problems with
|
|
2
|
+
unpredictable css rules order in build */
|
|
3
|
+
.bc-feed-filter__switch {
|
|
4
|
+
margin-right: 8px;
|
|
5
|
+
margin-left: 8px;
|
|
6
|
+
margin-bottom: 12px;
|
|
7
|
+
}
|
|
8
|
+
.bc-feed-filter__select {
|
|
9
|
+
width: 100%;
|
|
10
|
+
}
|
|
11
|
+
.bc-feed-filter__select:hover {
|
|
12
|
+
width: 100%;
|
|
13
|
+
}
|
|
14
|
+
.bc-feed-filter__popup.bc-feed-filter__popup {
|
|
15
|
+
max-height: 500px;
|
|
16
|
+
border-radius: 12px;
|
|
17
|
+
}
|
|
18
|
+
.bc-feed-filter__popup.bc-feed-filter__popup .g-select-list::-webkit-scrollbar {
|
|
19
|
+
display: none;
|
|
20
|
+
}
|
|
21
|
+
.bc-feed-filter__popup.bc-feed-filter__popup .g-select-list .g-list {
|
|
22
|
+
max-height: calc(500px - var(--g-text-body-3-line-height) - 12px);
|
|
23
|
+
}
|
|
24
|
+
.bc-feed-filter__popup.bc-feed-filter__popup .g-list__item {
|
|
25
|
+
margin: 4px;
|
|
26
|
+
border-radius: 8px;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.bc-feed-filter__popup_isMobile .bc-feed-filter__popup-filter {
|
|
30
|
+
position: relative;
|
|
31
|
+
border: none;
|
|
32
|
+
}
|
|
33
|
+
.bc-feed-filter__popup_isMobile .bc-feed-filter__popup-filter::before {
|
|
34
|
+
content: "";
|
|
35
|
+
position: absolute;
|
|
36
|
+
left: 50%;
|
|
37
|
+
bottom: 0px;
|
|
38
|
+
border-bottom: 2px solid var(--g-color-line-generic);
|
|
39
|
+
border-bottom-right-radius: 0;
|
|
40
|
+
border-bottom-left-radius: 0;
|
|
41
|
+
width: 100%;
|
|
42
|
+
height: 2px;
|
|
43
|
+
transform: translateX(-50%);
|
|
44
|
+
}
|
|
45
|
+
.bc-feed-filter__popup-filter {
|
|
46
|
+
font-size: var(--g-text-body-2-font-size);
|
|
47
|
+
line-height: var(--g-text-body-2-line-height);
|
|
48
|
+
padding: 4px 12px;
|
|
49
|
+
border: none;
|
|
50
|
+
border-bottom: 1px solid var(--g-color-line-generic);
|
|
51
|
+
border-bottom-right-radius: 0;
|
|
52
|
+
border-bottom-left-radius: 0;
|
|
53
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { FilterConfig, Query } from "../../../../models/common.js";
|
|
2
|
+
export type FilterProps = {
|
|
3
|
+
filter: FilterConfig;
|
|
4
|
+
initialValue: string | number | null | undefined;
|
|
5
|
+
onSelect: (query: Query) => void;
|
|
6
|
+
className?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const Filter: ({ filter, initialValue, onSelect, className }: FilterProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Filter = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const React = tslib_1.__importStar(require("react"));
|
|
7
|
+
const page_constructor_1 = require("@gravity-ui/page-constructor");
|
|
8
|
+
const uikit_1 = require("@gravity-ui/uikit");
|
|
9
|
+
const MobileContext_1 = require("../../../../contexts/MobileContext.js");
|
|
10
|
+
const cn_1 = require("../../../../utils/cn.js");
|
|
11
|
+
const customRenders_1 = require("./customRenders.js");
|
|
12
|
+
const b = (0, cn_1.block)('feed-filter');
|
|
13
|
+
const VIRTUALIZATION_THRESHOLD = 1000;
|
|
14
|
+
const Filter = ({ filter, initialValue, onSelect, className }) => {
|
|
15
|
+
const isMobile = React.useContext(MobileContext_1.MobileContext);
|
|
16
|
+
const handleAnalyticsFilter = (0, page_constructor_1.useAnalytics)();
|
|
17
|
+
const { queryParamName, qa, analyticsEvents, type } = filter;
|
|
18
|
+
const handleSwitchToggle = (checked) => {
|
|
19
|
+
if (analyticsEvents) {
|
|
20
|
+
handleAnalyticsFilter(analyticsEvents);
|
|
21
|
+
}
|
|
22
|
+
onSelect({ [queryParamName]: checked ? 'true' : '' });
|
|
23
|
+
};
|
|
24
|
+
if (type === 'boolean') {
|
|
25
|
+
const { label } = filter;
|
|
26
|
+
return ((0, jsx_runtime_1.jsx)(uikit_1.Flex, { className: b('switch'), alignItems: "center", children: (0, jsx_runtime_1.jsx)(uikit_1.Switch, { size: "l", qa: qa, defaultChecked: Boolean(initialValue), onUpdate: handleSwitchToggle, children: label }) }));
|
|
27
|
+
}
|
|
28
|
+
const { multiple, filterable, hasClear, options, placeholder, allLabel } = filter;
|
|
29
|
+
const handleFilterSelect = (selectedValues) => {
|
|
30
|
+
if (analyticsEvents) {
|
|
31
|
+
handleAnalyticsFilter(analyticsEvents);
|
|
32
|
+
}
|
|
33
|
+
const query = {};
|
|
34
|
+
if (multiple) {
|
|
35
|
+
query[queryParamName] = selectedValues.join(',');
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const isEmpty = selectedValues.some((v) => v === 'empty');
|
|
39
|
+
query[queryParamName] = isEmpty ? '' : selectedValues[0];
|
|
40
|
+
}
|
|
41
|
+
onSelect(query);
|
|
42
|
+
};
|
|
43
|
+
let defaultValue;
|
|
44
|
+
if (multiple) {
|
|
45
|
+
defaultValue = initialValue ? initialValue.split(',') : [];
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
defaultValue = [initialValue];
|
|
49
|
+
}
|
|
50
|
+
const optionsWithEmpty = multiple
|
|
51
|
+
? options
|
|
52
|
+
: [{ value: 'empty', content: allLabel }, ...options];
|
|
53
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: className, children: (0, jsx_runtime_1.jsx)(uikit_1.Select, { className: b('select'), size: "xl", multiple: multiple, filterable: filterable, hasClear: hasClear !== null && hasClear !== void 0 ? hasClear : multiple, disablePortal: true, options: optionsWithEmpty, defaultValue: defaultValue, popupClassName: b('popup', { isMobile }), onUpdate: handleFilterSelect, placeholder: placeholder !== null && placeholder !== void 0 ? placeholder : allLabel, renderControl: (0, customRenders_1.renderSwitcher)({
|
|
54
|
+
initial: defaultValue,
|
|
55
|
+
list: optionsWithEmpty,
|
|
56
|
+
defaultLabel: allLabel,
|
|
57
|
+
qa,
|
|
58
|
+
}), virtualizationThreshold: VIRTUALIZATION_THRESHOLD, renderOption: customRenders_1.renderOption, renderFilter: filterable ? (0, customRenders_1.renderFilter)({ className: b('popup-filter') }) : undefined }) }));
|
|
59
|
+
};
|
|
60
|
+
exports.Filter = Filter;
|
|
61
|
+
//# sourceMappingURL=Filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Filter.js","sourceRoot":"../../../../../../src","sources":["components/FeedHeader/components/Filters/Filter.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport {useAnalytics} from '@gravity-ui/page-constructor';\nimport {Flex, Select, SelectOptions, Switch} from '@gravity-ui/uikit';\n\nimport {MobileContext} from '../../../../contexts/MobileContext';\nimport {FilterConfig, Query} from '../../../../models/common';\nimport {block} from '../../../../utils/cn';\n\nimport {renderFilter, renderOption, renderSwitcher} from './customRenders';\n\nimport './Filter.scss';\n\nconst b = block('feed-filter');\n\nconst VIRTUALIZATION_THRESHOLD = 1000;\n\nexport type FilterProps = {\n filter: FilterConfig;\n initialValue: string | number | null | undefined;\n onSelect: (query: Query) => void;\n className?: string;\n};\n\nexport const Filter = ({filter, initialValue, onSelect, className}: FilterProps) => {\n const isMobile = React.useContext(MobileContext);\n const handleAnalyticsFilter = useAnalytics();\n\n const {queryParamName, qa, analyticsEvents, type} = filter;\n\n const handleSwitchToggle = (checked: boolean) => {\n if (analyticsEvents) {\n handleAnalyticsFilter(analyticsEvents);\n }\n\n onSelect({[queryParamName]: checked ? 'true' : ''});\n };\n\n if (type === 'boolean') {\n const {label} = filter;\n\n return (\n <Flex className={b('switch')} alignItems=\"center\">\n <Switch\n size=\"l\"\n qa={qa}\n defaultChecked={Boolean(initialValue)}\n onUpdate={handleSwitchToggle}\n >\n {label}\n </Switch>\n </Flex>\n );\n }\n\n const {multiple, filterable, hasClear, options, placeholder, allLabel} = filter;\n\n const handleFilterSelect = (selectedValues: string[]) => {\n if (analyticsEvents) {\n handleAnalyticsFilter(analyticsEvents);\n }\n\n const query: Query = {};\n\n if (multiple) {\n query[queryParamName] = selectedValues.join(',');\n } else {\n const isEmpty = selectedValues.some((v) => v === 'empty');\n query[queryParamName] = isEmpty ? '' : selectedValues[0];\n }\n\n onSelect(query);\n };\n\n let defaultValue: string[];\n if (multiple) {\n defaultValue = initialValue ? (initialValue as string).split(',') : [];\n } else {\n defaultValue = [initialValue] as string[];\n }\n\n const optionsWithEmpty: SelectOptions = multiple\n ? options\n : [{value: 'empty', content: allLabel}, ...options];\n\n return (\n <div className={className}>\n <Select\n className={b('select')}\n size=\"xl\"\n multiple={multiple}\n filterable={filterable}\n hasClear={hasClear ?? multiple}\n disablePortal\n options={optionsWithEmpty}\n defaultValue={defaultValue}\n popupClassName={b('popup', {isMobile})}\n onUpdate={handleFilterSelect}\n placeholder={placeholder ?? allLabel}\n renderControl={renderSwitcher({\n initial: defaultValue,\n list: optionsWithEmpty,\n defaultLabel: allLabel,\n qa,\n })}\n virtualizationThreshold={VIRTUALIZATION_THRESHOLD}\n renderOption={renderOption}\n renderFilter={filterable ? renderFilter({className: b('popup-filter')}) : undefined}\n />\n </div>\n );\n};\n"]}
|
|
@@ -6,7 +6,9 @@ type RenderSwitcherType = ({ initial, list, defaultLabel, }: {
|
|
|
6
6
|
defaultLabel: string;
|
|
7
7
|
qa?: string;
|
|
8
8
|
}) => SelectProps['renderControl'];
|
|
9
|
-
type RenderFilterType =
|
|
9
|
+
type RenderFilterType = (options: {
|
|
10
|
+
className?: string;
|
|
11
|
+
}) => SelectProps['renderFilter'];
|
|
10
12
|
export declare const renderSwitcher: RenderSwitcherType;
|
|
11
13
|
export declare const renderFilter: RenderFilterType;
|
|
12
14
|
export declare const renderOption: (option: SelectOption) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -5,10 +5,8 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
6
|
const uikit_1 = require("@gravity-ui/uikit");
|
|
7
7
|
const i18n_1 = require("../../../../i18n/index.js");
|
|
8
|
-
const cn_1 = require("../../../../utils/cn.js");
|
|
9
8
|
const CustomSelectOption_1 = require("../CustomSelectOption/CustomSelectOption.js");
|
|
10
9
|
const CustomSwitcher_1 = require("../CustomSwitcher/CustomSwitcher.js");
|
|
11
|
-
const b = (0, cn_1.block)('feed-controls');
|
|
12
10
|
const renderSwitcher = ({ initial, list, defaultLabel, qa }) =>
|
|
13
11
|
// eslint-disable-next-line react/display-name
|
|
14
12
|
(_a) => {
|
|
@@ -19,9 +17,11 @@ const renderSwitcher = ({ initial, list, defaultLabel, qa }) =>
|
|
|
19
17
|
}, renderClear: renderClear, a11yProps: a11yProps, qa: qa }));
|
|
20
18
|
};
|
|
21
19
|
exports.renderSwitcher = renderSwitcher;
|
|
22
|
-
const renderFilter = (
|
|
20
|
+
const renderFilter = ({ className }) =>
|
|
21
|
+
// eslint-disable-next-line react/display-name
|
|
22
|
+
(_a) => {
|
|
23
23
|
var { ref, onChange } = _a, _b = _a.inputProps, { value, onKeyDown, onChange: _, size: __, placeholder: ___ } = _b, a11yProps = tslib_1.__rest(_b, ["value", "onKeyDown", "onChange", "size", "placeholder"]);
|
|
24
|
-
return ((0, jsx_runtime_1.jsx)(uikit_1.TextInput, { value: value, view: "clear", placeholder: (0, i18n_1.i18n)(i18n_1.Keyset.Search), onUpdate: onChange, onKeyDown: onKeyDown, className:
|
|
24
|
+
return ((0, jsx_runtime_1.jsx)(uikit_1.TextInput, { value: value, view: "clear", placeholder: (0, i18n_1.i18n)(i18n_1.Keyset.Search), onUpdate: onChange, onKeyDown: onKeyDown, className: className, controlRef: ref, controlProps: Object.assign({ size: 1 }, a11yProps) }));
|
|
25
25
|
};
|
|
26
26
|
exports.renderFilter = renderFilter;
|
|
27
27
|
const renderOption = (option) => ((0, jsx_runtime_1.jsx)(CustomSelectOption_1.CustomSelectOption, { data: option }));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customRenders.js","sourceRoot":"../../../../../../src","sources":["components/FeedHeader/components/Filters/customRenders.tsx"],"names":[],"mappings":";;;;;AAAA,6CAAuE;AAEvE,oDAA8C;AAC9C,oFAGkD;AAClD,wEAAqF;AAe9E,MAAM,cAAc,GACvB,CAAC,EAAC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAC,EAAE,EAAE;AACtC,8CAA8C;AAC9C,CAAC,EAAwF,EAAE,EAAE;QAA5F,EAAC,GAAG,EAAE,WAAW,OAAuE,EAArE,oBAAoE,EAApE,EAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,OAAe,EAAV,SAAS,sBAArD,kDAAsD,CAAD;IAAO,OAAA,CAC1F,uBAAC,+BAAc,IACX,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,GAAG,EACf,YAAY,EAAE;YACV,OAAO;YACP,SAAS;SACZ,EACD,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,EAAE,GACR,CACL,CAAA;CAAA,CAAC;AApBO,QAAA,cAAc,kBAoBrB;AAEC,MAAM,YAAY,GACrB,CAAC,EAAC,SAAS,EAAC,EAAE,EAAE;AAChB,8CAA8C;AAC9C,CAAC,EAIA,EAAE,EAAE;QAJJ,EACG,GAAG,EACH,QAAQ,OAEX,EADG,kBAAqF,EAArF,EAAa,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,OAAe,EAAV,SAAS,sBAAxE,yDAAyE,CAAD;IAClF,OAAA,CACF,uBAAC,iBAAS,IACN,KAAK,EAAE,KAAK,EACZ,IAAI,EAAC,OAAO,EACZ,WAAW,EAAE,IAAA,WAAI,EAAC,aAAM,CAAC,MAAM,CAAC,EAChC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,GAAG,EACf,YAAY,kBAAG,IAAI,EAAE,CAAC,IAAK,SAAS,IACtC,CACL,CAAA;CAAA,CAAC;AAlBO,QAAA,YAAY,gBAkBnB;AAEC,MAAM,YAAY,GAAG,CAAC,MAAoB,EAAE,EAAE,CAAC,CAClD,uBAAC,uCAAkB,IAAC,IAAI,EAAE,MAAyC,GAAI,CAC1E,CAAC;AAFW,QAAA,YAAY,gBAEvB","sourcesContent":["import {SelectOption, SelectProps, TextInput} from '@gravity-ui/uikit';\n\nimport {Keyset, i18n} from '../../../../i18n';\nimport {\n CustomSelectOption,\n CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport {CustomSwitcher, CustomSwitcherProps} from '../CustomSwitcher/CustomSwitcher';\n\ntype RenderSwitcherType = ({\n initial,\n list,\n defaultLabel,\n}: {\n initial: CustomSwitcherProps['initial'];\n list: CustomSwitcherProps['list'];\n defaultLabel: string;\n qa?: string;\n}) => SelectProps['renderControl'];\n\ntype RenderFilterType = (options: {className?: string}) => SelectProps['renderFilter'];\n\nexport const renderSwitcher: RenderSwitcherType =\n ({initial, list, defaultLabel, qa}) =>\n // eslint-disable-next-line react/display-name\n ({ref, renderClear, triggerProps: {id, disabled, type, onClick, onKeyDown, ...a11yProps}}) => (\n <CustomSwitcher\n id={id}\n disabled={disabled}\n type={type}\n initial={initial}\n defaultLabel={defaultLabel}\n list={list}\n controlRef={ref}\n triggerProps={{\n onClick,\n onKeyDown,\n }}\n renderClear={renderClear}\n a11yProps={a11yProps}\n qa={qa}\n />\n );\n\nexport const renderFilter: RenderFilterType =\n ({className}) =>\n // eslint-disable-next-line react/display-name\n ({\n ref,\n onChange,\n inputProps: {value, onKeyDown, onChange: _, size: __, placeholder: ___, ...a11yProps},\n }) => (\n <TextInput\n value={value}\n view=\"clear\"\n placeholder={i18n(Keyset.Search)}\n onUpdate={onChange}\n onKeyDown={onKeyDown}\n className={className}\n controlRef={ref}\n controlProps={{size: 1, ...a11yProps}}\n />\n );\n\nexport const renderOption = (option: SelectOption) => (\n <CustomSelectOption data={option as CustomSelectOptionProps['data']} />\n);\n"]}
|
|
@@ -32,7 +32,7 @@ unpredictable css rules order in build */
|
|
|
32
32
|
.bc-search__search-suggest:hover, .bc-search__search-suggest:focus {
|
|
33
33
|
border: 1px solid var(--g-color-base-generic-hover);
|
|
34
34
|
}
|
|
35
|
-
.bc-search .bc-search__search-suggest-control {
|
|
35
|
+
.bc-search .bc-search__search-suggest .bc-search__search-suggest-control {
|
|
36
36
|
padding-left: 12px;
|
|
37
37
|
padding-right: 32px;
|
|
38
38
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { MarkdownItPluginCb } from '@diplodoc/transform/lib/plugins/typings';
|
|
3
|
-
import { HeaderBlockProps as PageConstructorHeaderBlockProps } from '@gravity-ui/page-constructor';
|
|
4
|
-
import {
|
|
3
|
+
import { AnalyticsEventsProp, HeaderBlockProps as PageConstructorHeaderBlockProps } from '@gravity-ui/page-constructor';
|
|
4
|
+
import { SelectOptions, SelectProps } from '@gravity-ui/uikit';
|
|
5
5
|
import { IBrowser, IDevice } from 'ua-parser-js';
|
|
6
6
|
import { Locale } from "./locale.js";
|
|
7
7
|
export declare enum Theme {
|
|
@@ -163,17 +163,28 @@ export type FetchArgs = {
|
|
|
163
163
|
export interface QAProps {
|
|
164
164
|
qa?: string;
|
|
165
165
|
}
|
|
166
|
-
|
|
167
|
-
export type FilterConfig = Pick<SelectProps, 'multiple' | 'filterable' | 'hasClear' | 'placeholder'> & {
|
|
166
|
+
type FilterConfigBase = {
|
|
168
167
|
/** The key used in queryParams and passed to handleLoadData query */
|
|
169
168
|
queryParamName: string;
|
|
169
|
+
/** Optional QA attribute forwarded to the control */
|
|
170
|
+
qa?: string;
|
|
171
|
+
/** Optional analytics events fired when this filter value changes */
|
|
172
|
+
analyticsEvents?: AnalyticsEventsProp;
|
|
173
|
+
};
|
|
174
|
+
type SelectFilterConfig = FilterConfigBase & Pick<SelectProps, 'multiple' | 'filterable' | 'hasClear' | 'placeholder'> & {
|
|
175
|
+
type: 'select';
|
|
170
176
|
/** The selectable items for this filter */
|
|
171
|
-
|
|
172
|
-
/** Label shown when nothing is selected (acts as "All
|
|
177
|
+
options: SelectOptions;
|
|
178
|
+
/** Label shown when nothing is selected (acts as "All …" placeholder option in single mode) */
|
|
173
179
|
allLabel: string;
|
|
174
|
-
/** Optional QA attribute forwarded to the switcher */
|
|
175
|
-
qa?: string;
|
|
176
180
|
};
|
|
181
|
+
type BooleanFilterConfig = FilterConfigBase & {
|
|
182
|
+
/** Renders a Switch instead of a Select */
|
|
183
|
+
type: 'boolean';
|
|
184
|
+
/** Label rendered next to the switch toggle */
|
|
185
|
+
label: string;
|
|
186
|
+
};
|
|
187
|
+
export type FilterConfig = SelectFilterConfig | BooleanFilterConfig;
|
|
177
188
|
export declare enum PostCardSize {
|
|
178
189
|
SMALL = "s",
|
|
179
190
|
MEDIUM = "m"
|
|
@@ -185,3 +196,4 @@ export declare enum PostCardTitleHeadingLevel {
|
|
|
185
196
|
export interface TransformPostOptions {
|
|
186
197
|
plugins?: MarkdownItPluginCb[];
|
|
187
198
|
}
|
|
199
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"../../../src","sources":["models/common.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"../../../src","sources":["models/common.ts"],"names":[],"mappings":";;;AAaA,IAAY,KAGX;AAHD,WAAY,KAAK;IACb,wBAAe,CAAA;IACf,sBAAa,CAAA;AACjB,CAAC,EAHW,KAAK,qBAAL,KAAK,QAGhB;AAmFD,IAAY,SAgBX;AAhBD,WAAY,SAAS;IACjB,yCAA4B,CAAA;IAC5B,mCAAsB,CAAA;IACtB,yCAA4B,CAAA;IAC5B,uCAA0B,CAAA;IAC1B,yCAA4B,CAAA;IAC5B,mCAAsB,CAAA;IACtB,oDAAuC,CAAA;IACvC,yCAA4B,CAAA;IAC5B,2CAA8B,CAAA;IAC9B,qCAAwB,CAAA;IACxB,qCAAwB,CAAA;IACxB,qCAAwB,CAAA;IACxB,sDAAyC,CAAA;IACzC,qCAAwB,CAAA;IACxB,uDAA0C,CAAA;AAC9C,CAAC,EAhBW,SAAS,yBAAT,SAAS,QAgBpB;AA8DD,IAAY,iBAUX;AAVD,WAAY,iBAAiB;IACzB,uDAAkC,CAAA;IAClC,qDAAgC,CAAA;IAChC,wDAAmC,CAAA;IACnC,kEAA6C,CAAA;IAC7C,kEAA6C,CAAA;IAC7C,kEAA6C,CAAA;IAC7C,+CAA0B,CAAA;IAC1B,uDAAkC,CAAA;IAClC,wDAAmC,CAAA;AACvC,CAAC,EAVW,iBAAiB,iCAAjB,iBAAiB,QAU5B;AAsCD,IAAY,YAGX;AAHD,WAAY,YAAY;IACpB,2BAAW,CAAA;IACX,4BAAY,CAAA;AAChB,CAAC,EAHW,YAAY,4BAAZ,YAAY,QAGvB;AAED,IAAY,yBAGX;AAHD,WAAY,yBAAyB;IACjC,sCAAS,CAAA;IACT,sCAAS,CAAA;AACb,CAAC,EAHW,yBAAyB,yCAAzB,yBAAyB,QAGpC","sourcesContent":["import * as React from 'react';\n\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport {MarkdownItPluginCb} from '@diplodoc/transform/lib/plugins/typings';\nimport {\n AnalyticsEventsProp,\n HeaderBlockProps as PageConstructorHeaderBlockProps,\n} from '@gravity-ui/page-constructor';\nimport {SelectOptions, SelectProps} from '@gravity-ui/uikit';\nimport {IBrowser, IDevice} from 'ua-parser-js';\n\nimport {Locale} from '../models/locale';\n\nexport enum Theme {\n Light = 'light',\n Dark = 'dark',\n}\n\nexport interface ClassNameProps {\n className?: string;\n}\n\nexport type Author = {\n id: number | string;\n avatar: string | null;\n createdAt: string;\n updatedAt: string;\n firstName: string | null;\n secondName: string | null;\n description: string | null;\n fullDescription: string | null;\n shortDescription: string | null;\n} & {\n [x: string]: string | null;\n};\n\nexport type Query = Record<string, number | string | null>;\n\n//page models\n\nexport interface Menu {\n title: string;\n}\n\nexport interface WithDeviceProps {\n device: IDevice;\n browser: IBrowser;\n isRobot: boolean;\n}\n\nexport interface PostsProps {\n posts: PostData[];\n count: number;\n totalCount: number;\n pinnedPost?: PostData;\n}\n\nexport type Tag = {\n slug: string;\n name: string;\n createdAt?: string;\n updatedAt?: string;\n icon?: string;\n isDeleted?: boolean;\n locale?: string;\n blogTagId?: number | string;\n count?: number;\n};\n\nexport interface PostData {\n author?: string;\n authors?: Author[];\n blogPostId?: number | string;\n content?: string;\n date: string;\n description?: string;\n hasUserLike: boolean;\n htmlTitle: string;\n id: number;\n image: string;\n isPublished?: boolean;\n sharedImage?: string;\n likes: number;\n locale: Locale;\n metaDescription?: string | null;\n metaTitle?: string | null;\n readingTime?: number;\n shareDescription?: string;\n shareImage?: string;\n shareTitle?: string;\n slug: string;\n keywords?: string[];\n tags: Tag[];\n textTitle: string;\n title: string;\n url: string;\n noIndex?: boolean;\n}\n\nexport enum BlockType {\n Header = 'blog-header-block',\n YFM = 'blog-yfm-block',\n Layout = 'blog-layout-block',\n Media = 'blog-media-block',\n Banner = 'blog-banner-block',\n CTA = 'blog-cta-block',\n ColoredText = 'blog-colored-text-block',\n Author = 'blog-author-block',\n Suggest = 'blog-suggest-block',\n Meta = 'blog-meta-block',\n Feed = 'blog-feed-block',\n Form = 'blog-form-block',\n CompactMedia = 'blog-compact-media-block',\n Take = 'blog-take-block',\n SideCardList = 'blog-side-card-list-block',\n}\n\nexport type MetaProps = {\n metaComponent: JSX.Element;\n needHelmetWrapper: boolean;\n};\n\nexport type MetaOrganizationType = {\n url: string;\n appTitle: string;\n legalName: string;\n supportEmail: string;\n};\n\nexport interface PostMetaProps {\n title: string;\n date: string;\n image: string;\n canonicalUrl: string;\n content?: string;\n description?: string;\n sharing: {\n shareTitle: string;\n shareDescription: string;\n shareImage: string;\n shareGenImage: string;\n shareGenTitle: string;\n };\n keywords?: string[];\n noIndex?: boolean;\n authors?: Author[];\n tags?: Tag[];\n organization: MetaOrganizationType;\n}\n\nexport type ToggleLikeCallbackType = ({\n postId,\n hasLike,\n}: {\n postId?: number | string;\n hasLike?: boolean;\n}) => void;\n\nexport interface HeaderBlockProps extends PageConstructorHeaderBlockProps {\n backLink?: {\n url: string;\n title: React.ReactNode;\n };\n}\n\nexport type GetPostsRequest = {\n page: number;\n perPage: number;\n savedOnly: boolean;\n search: string | undefined;\n [filterParam: string]: string | number | boolean | undefined;\n};\n\nexport type GetPostsType = (query: GetPostsRequest) => Promise<PostsProps>;\n\nexport type HandleChangeQueryParams = (params: Query) => void;\n\nexport enum DefaultEventNames {\n ShareButton = 'share-button-click',\n SaveButton = 'save-button-click',\n ShowMore = 'show-more-button-click',\n PaginatorHome = 'paginator-home-button-click',\n PaginatorNext = 'paginator-next-button-click',\n PaginatorPage = 'paginator-page-button-click',\n Tag = 'selector-tag-click',\n Service = 'selector-service-click',\n SaveOnly = 'save-only-button-click',\n}\n\nexport type FetchArgs = {\n page?: number;\n query: Query;\n};\n\nexport interface QAProps {\n qa?: string;\n}\n\ntype FilterConfigBase = {\n /** The key used in queryParams and passed to handleLoadData query */\n queryParamName: string;\n /** Optional QA attribute forwarded to the control */\n qa?: string;\n /** Optional analytics events fired when this filter value changes */\n analyticsEvents?: AnalyticsEventsProp;\n};\n\ntype SelectFilterConfig = FilterConfigBase &\n Pick<SelectProps, 'multiple' | 'filterable' | 'hasClear' | 'placeholder'> & {\n type: 'select';\n /** The selectable items for this filter */\n options: SelectOptions;\n /** Label shown when nothing is selected (acts as \"All …\" placeholder option in single mode) */\n allLabel: string;\n };\n\ntype BooleanFilterConfig = FilterConfigBase & {\n /** Renders a Switch instead of a Select */\n type: 'boolean';\n /** Label rendered next to the switch toggle */\n label: string;\n};\n\nexport type FilterConfig = SelectFilterConfig | BooleanFilterConfig;\n\nexport enum PostCardSize {\n SMALL = 's',\n MEDIUM = 'm',\n}\n\nexport enum PostCardTitleHeadingLevel {\n H2 = 'h2',\n H3 = 'h3',\n}\n\nexport interface TransformPostOptions {\n plugins?: MarkdownItPluginCb[];\n}\n"]}
|
|
@@ -101,11 +101,6 @@ const getFeedQueryParams = (queryString, pageNumber, filters) => {
|
|
|
101
101
|
filterParams[queryParamName] = queryParams.get(queryParamName) || undefined;
|
|
102
102
|
});
|
|
103
103
|
}
|
|
104
|
-
else {
|
|
105
|
-
// fallback: preserve legacy tags/services keys if no filters config provided
|
|
106
|
-
filterParams['tags'] = queryParams.get('tags') || undefined;
|
|
107
|
-
filterParams['services'] = queryParams.get('services') || undefined;
|
|
108
|
-
}
|
|
109
104
|
return Object.assign({ page, perPage, savedOnly, search }, filterParams);
|
|
110
105
|
};
|
|
111
106
|
exports.getFeedQueryParams = getFeedQueryParams;
|