@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.
Files changed (40) hide show
  1. package/build/cjs/components/FeedHeader/components/Controls/Controls.css +14 -60
  2. package/build/cjs/components/FeedHeader/components/Controls/Controls.js +3 -38
  3. package/build/cjs/components/FeedHeader/components/Controls/Controls.js.map +1 -1
  4. package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.d.ts +2 -3
  5. package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js +4 -1
  6. package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js.map +1 -1
  7. package/build/cjs/components/FeedHeader/components/Filters/Filter.css +53 -0
  8. package/build/cjs/components/FeedHeader/components/Filters/Filter.d.ts +8 -0
  9. package/build/cjs/components/FeedHeader/components/Filters/Filter.js +61 -0
  10. package/build/cjs/components/FeedHeader/components/Filters/Filter.js.map +1 -0
  11. package/build/cjs/components/FeedHeader/components/{Controls → Filters}/customRenders.d.ts +3 -1
  12. package/build/cjs/components/FeedHeader/components/{Controls → Filters}/customRenders.js +4 -4
  13. package/build/cjs/components/FeedHeader/components/Filters/customRenders.js.map +1 -0
  14. package/build/cjs/components/Search/Search.css +1 -1
  15. package/build/cjs/models/common.d.ts +20 -8
  16. package/build/cjs/models/common.js.map +1 -1
  17. package/build/cjs/utils/common.js +0 -5
  18. package/build/cjs/utils/common.js.map +1 -1
  19. package/build/esm/components/FeedHeader/components/Controls/Controls.css +14 -60
  20. package/build/esm/components/FeedHeader/components/Controls/Controls.js +5 -40
  21. package/build/esm/components/FeedHeader/components/Controls/Controls.js.map +1 -1
  22. package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.d.ts +2 -3
  23. package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js +5 -2
  24. package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js.map +1 -1
  25. package/build/esm/components/FeedHeader/components/Filters/Filter.css +53 -0
  26. package/build/esm/components/FeedHeader/components/Filters/Filter.d.ts +9 -0
  27. package/build/esm/components/FeedHeader/components/Filters/Filter.js +57 -0
  28. package/build/esm/components/FeedHeader/components/Filters/Filter.js.map +1 -0
  29. package/build/esm/components/FeedHeader/components/{Controls → Filters}/customRenders.d.ts +3 -2
  30. package/build/esm/components/FeedHeader/components/{Controls → Filters}/customRenders.js +4 -5
  31. package/build/esm/components/FeedHeader/components/Filters/customRenders.js.map +1 -0
  32. package/build/esm/components/Search/Search.css +1 -1
  33. package/build/esm/models/common.d.ts +20 -8
  34. package/build/esm/models/common.js.map +1 -1
  35. package/build/esm/utils/common.js +0 -5
  36. package/build/esm/utils/common.js.map +1 -1
  37. package/package.json +1 -1
  38. package/server/models/common.d.ts +20 -8
  39. package/build/cjs/components/FeedHeader/components/Controls/customRenders.js.map +0 -1
  40. 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 customRenders_1 = require("./customRenders.js");
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 makeHandleFilterSelect = (filter) => (selectedValues) => {
48
- const query = { page: DEFAULT_PAGE };
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":";;;;;AAAA,qDAA+B;AAE/B,6CAA2C;AAC3C,mEAA0D;AAC1D,6CAA+D;AAE/D,uEAA+D;AAC/D,oDAA8C;AAC9C,yDAA4F;AAC5F,gDAA2C;AAC3C,sDAA8C;AAC9C,iDAAyC;AAIzC,MAAM,CAAC,GAAG,IAAA,UAAK,EAAC,eAAe,CAAC,CAAC;AASjC,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,YAAY,GAAG,CAAC,CAAC;AAEhB,MAAM,QAAQ,GAAG,CAAC,EACrB,cAAc,EACd,OAAO,GAAG,EAAE,EACZ,WAAW,EACX,KAAK,GAAG,IAAA,WAAI,EAAC,aAAM,CAAC,KAAK,CAAC,GACd,EAAE,EAAE;IAChB,MAAM,EAAC,QAAQ,EAAC,GAAG,KAAK,CAAC,UAAU,CAAC,2BAAY,CAAC,CAAC;IAClD,MAAM,uBAAuB,GAAG,IAAA,+BAAY,EAAC,0BAAiB,CAAC,QAAQ,CAAC,CAAC;IAEzE,MAAM,EAAC,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAC,GAAG,WAAW,IAAI,EAAE,CAAC;IAE/E,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAU,gBAAgB,KAAK,MAAM,CAAC,CAAC;IACvF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAS,aAAuB,CAAC,CAAC;IAE5E,MAAM,eAAe,GAAG,GAAG,EAAE;QACzB,uBAAuB,EAAE,CAAC;QAC1B,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC;QACzB,cAAc,CAAC;YACX,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE;gBACH,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM;gBAClC,MAAM,EAAE,EAAE;gBACV,IAAI,EAAE,YAAY;aACrB;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAClC,CAAC,WAAmB,EAAE,EAAE;QACpB,SAAS,CAAC,WAAW,CAAC,CAAC;QAEvB,cAAc,CAAC;YACX,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,EAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAC;SACnD,CAAC,CAAC;IACP,CAAC,EACD,CAAC,cAAc,CAAC,CACnB,CAAC;IAEF,MAAM,kBAAkB,GAAG,KAAK,CAAC,WAAW,CACxC,CAAC,KAAY,EAAE,EAAE,CACb,cAAc,CAAC,EAAC,IAAI,EAAE,YAAY,EAAE,KAAK,kBAAG,IAAI,EAAE,YAAY,IAAK,KAAK,CAAC,EAAC,CAAC,EAC/E,CAAC,cAAc,CAAC,CACnB,CAAC;IAEF,OAAO,CACH,uBAAC,sBAAc,IAAC,MAAM,EAAE,KAAK,YACzB,iCAAK,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,aACvB,+BAAI,SAAS,EAAE,CAAC,CAAC,aAAa,EAAE,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC,YAAG,KAAK,GAAM,EAC5D,iCAAK,SAAS,EAAE,CAAC,CAAC,aAAa,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,aAC7C,gCAAK,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,YAC5B,uBAAC,eAAM,IACH,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,EACtB,WAAW,EAAE,IAAA,WAAI,EAAC,aAAM,CAAC,MAAM,CAAC,EAChC,YAAY,EAAE,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAChE,QAAQ,EAAE,YAAY,GACxB,GACA,EAEL,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACrB,uBAAC,eAAM,IAEH,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAG,MAAM,CAAC,cAAc,CAAC,EAClD,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,IAJtB,MAAM,CAAC,cAAc,CAK5B,CACL,CAAC,EAED,QAAQ,CAAC,CAAC,CAAC,CACR,gCAAK,SAAS,EAAE,CAAC,CAAC,aAAa,EAAE,EAAC,YAAY,EAAE,IAAI,EAAC,CAAC,YAClD,wBAAC,cAAM,IACH,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,CAAC,CAAC,mBAAmB,EAAE,EAAC,SAAS,EAAC,CAAC,EAC9C,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,SAAS,aAEnB,uBAAC,YAAI,IACD,IAAI,EAAE,gBAAQ,EACd,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAC,SAAS,EAAC,CAAC,GACnC,EACD,IAAA,WAAI,EAAC,aAAM,CAAC,eAAe,CAAC,IACxB,GACP,CACT,CAAC,CAAC,CAAC,IAAI,IACN,IACJ,GACO,CACpB,CAAC;AACN,CAAC,CAAC;AA3FW,QAAA,QAAQ,YA2FnB","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: SelectItem[];
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 items = list
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,6CAA+D;AAG/D,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,KAAK,GAAG,IAAI;aACb,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;AA3DW,QAAA,cAAc,kBA2DzB","sourcesContent":["import * as React from 'react';\n\nimport {ChevronDown, Xmark} from '@gravity-ui/icons';\nimport {Icon, SelectProps, useUniqId} from '@gravity-ui/uikit';\n\nimport {SelectItem} from '../../../../models/common';\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: SelectItem[];\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 items = list\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"]}
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 = SelectProps['renderFilter'];
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 = (_a) => {
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: b('popup-filter'), controlRef: ref, controlProps: Object.assign({ size: 1 }, a11yProps) }));
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 { SelectOption, SelectProps } from '@gravity-ui/uikit';
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
- export type SelectItem = SelectOption;
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
- items: SelectItem[];
172
- /** Label shown when nothing is selected (acts as "All ..." placeholder) */
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":";;;AAUA,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;AA2BD,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 {HeaderBlockProps as PageConstructorHeaderBlockProps} from '@gravity-ui/page-constructor';\nimport {SelectOption, 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\nexport type SelectItem = SelectOption;\n\nexport type FilterConfig = Pick<\n SelectProps,\n 'multiple' | 'filterable' | 'hasClear' | 'placeholder'\n> & {\n /** The key used in queryParams and passed to handleLoadData query */\n queryParamName: string;\n /** The selectable items for this filter */\n items: SelectItem[];\n /** Label shown when nothing is selected (acts as \"All ...\" placeholder) */\n allLabel: string;\n /** Optional QA attribute forwarded to the switcher */\n qa?: string;\n};\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"]}
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;