@gravity-ui/blog-constructor 9.1.2 → 10.0.0

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 (61) hide show
  1. package/README.md +1 -1
  2. package/build/cjs/blocks/Feed/Feed.js +4 -14
  3. package/build/cjs/blocks/Feed/Feed.js.map +1 -1
  4. package/build/cjs/components/FeedHeader/FeedHeader.d.ts +1 -1
  5. package/build/cjs/components/FeedHeader/FeedHeader.js +2 -2
  6. package/build/cjs/components/FeedHeader/FeedHeader.js.map +1 -1
  7. package/build/cjs/components/FeedHeader/components/Controls/Controls.css +14 -60
  8. package/build/cjs/components/FeedHeader/components/Controls/Controls.d.ts +3 -10
  9. package/build/cjs/components/FeedHeader/components/Controls/Controls.js +5 -62
  10. package/build/cjs/components/FeedHeader/components/Controls/Controls.js.map +1 -1
  11. package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.d.ts +2 -3
  12. package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js.map +1 -1
  13. package/build/cjs/components/FeedHeader/components/Filters/Filter.css +48 -0
  14. package/build/cjs/components/FeedHeader/components/Filters/Filter.d.ts +8 -0
  15. package/build/cjs/components/FeedHeader/components/Filters/Filter.js +50 -0
  16. package/build/cjs/components/FeedHeader/components/Filters/Filter.js.map +1 -0
  17. package/build/cjs/components/FeedHeader/components/{Controls → Filters}/customRenders.d.ts +3 -1
  18. package/build/cjs/components/FeedHeader/components/{Controls → Filters}/customRenders.js +4 -4
  19. package/build/cjs/components/FeedHeader/components/Filters/customRenders.js.map +1 -0
  20. package/build/cjs/containers/BlogPage/BlogPage.d.ts +3 -4
  21. package/build/cjs/containers/BlogPage/BlogPage.js +2 -3
  22. package/build/cjs/containers/BlogPage/BlogPage.js.map +1 -1
  23. package/build/cjs/contexts/FeedContext.d.ts +2 -3
  24. package/build/cjs/contexts/FeedContext.js.map +1 -1
  25. package/build/cjs/models/common.d.ts +15 -10
  26. package/build/cjs/models/common.js.map +1 -1
  27. package/build/cjs/utils/common.d.ts +2 -2
  28. package/build/cjs/utils/common.js +8 -4
  29. package/build/cjs/utils/common.js.map +1 -1
  30. package/build/esm/blocks/Feed/Feed.js +4 -14
  31. package/build/esm/blocks/Feed/Feed.js.map +1 -1
  32. package/build/esm/components/FeedHeader/FeedHeader.d.ts +1 -1
  33. package/build/esm/components/FeedHeader/FeedHeader.js +2 -2
  34. package/build/esm/components/FeedHeader/FeedHeader.js.map +1 -1
  35. package/build/esm/components/FeedHeader/components/Controls/Controls.css +14 -60
  36. package/build/esm/components/FeedHeader/components/Controls/Controls.d.ts +3 -10
  37. package/build/esm/components/FeedHeader/components/Controls/Controls.js +6 -63
  38. package/build/esm/components/FeedHeader/components/Controls/Controls.js.map +1 -1
  39. package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.d.ts +2 -3
  40. package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js.map +1 -1
  41. package/build/esm/components/FeedHeader/components/Filters/Filter.css +48 -0
  42. package/build/esm/components/FeedHeader/components/Filters/Filter.d.ts +9 -0
  43. package/build/esm/components/FeedHeader/components/Filters/Filter.js +46 -0
  44. package/build/esm/components/FeedHeader/components/Filters/Filter.js.map +1 -0
  45. package/build/esm/components/FeedHeader/components/{Controls → Filters}/customRenders.d.ts +3 -2
  46. package/build/esm/components/FeedHeader/components/{Controls → Filters}/customRenders.js +4 -5
  47. package/build/esm/components/FeedHeader/components/Filters/customRenders.js.map +1 -0
  48. package/build/esm/containers/BlogPage/BlogPage.d.ts +3 -4
  49. package/build/esm/containers/BlogPage/BlogPage.js +2 -3
  50. package/build/esm/containers/BlogPage/BlogPage.js.map +1 -1
  51. package/build/esm/contexts/FeedContext.d.ts +2 -3
  52. package/build/esm/contexts/FeedContext.js.map +1 -1
  53. package/build/esm/models/common.d.ts +15 -10
  54. package/build/esm/models/common.js.map +1 -1
  55. package/build/esm/utils/common.d.ts +2 -2
  56. package/build/esm/utils/common.js +8 -4
  57. package/build/esm/utils/common.js.map +1 -1
  58. package/package.json +1 -1
  59. package/server/models/common.d.ts +15 -10
  60. package/build/cjs/components/FeedHeader/components/Controls/customRenders.js.map +0 -1
  61. package/build/esm/components/FeedHeader/components/Controls/customRenders.js.map +0 -1
package/README.md CHANGED
@@ -24,7 +24,7 @@ import {BlogPage, BlogConstructorProvider} from '@gravity-ui/blog-constructor';
24
24
  <BlogPage
25
25
  content={content}
26
26
  posts={posts}
27
- tags={tags}
27
+ filters={filters}
28
28
  getPosts={handleGetPosts}
29
29
  settings={settings}
30
30
  />
@@ -5,7 +5,6 @@ const tslib_1 = require("tslib");
5
5
  const jsx_runtime_1 = require("react/jsx-runtime");
6
6
  const React = tslib_1.__importStar(require("react"));
7
7
  const page_constructor_1 = require("@gravity-ui/page-constructor");
8
- const uikit_1 = require("@gravity-ui/uikit");
9
8
  const FeedHeader_1 = require("../../components/FeedHeader/FeedHeader.js");
10
9
  const Posts_1 = require("../../components/Posts/Posts.js");
11
10
  const PostsError_1 = require("../../components/PostsError/PostsError.js");
@@ -22,7 +21,7 @@ const PAGE_QUERY = 'page';
22
21
  const FIRST_PAGE = 1;
23
22
  const Feed = ({ image, title }) => {
24
23
  var _a;
25
- const { posts, totalCount, tags, services, pinnedPost, getPosts, pageCountForShowSupportButtons, } = React.useContext(FeedContext_1.FeedContext);
24
+ const { posts, totalCount, filters, pinnedPost, getPosts, pageCountForShowSupportButtons } = React.useContext(FeedContext_1.FeedContext);
26
25
  const router = React.useContext(RouterContext_1.RouterContext);
27
26
  const handleAnalytics = (0, page_constructor_1.useAnalytics)(common_1.DefaultEventNames.ShowMore);
28
27
  const additionalAnalyticsEvent = (0, common_2.prepareAnalyticsEvent)({
@@ -62,14 +61,14 @@ const Feed = ({ image, title }) => {
62
61
  }, [router]);
63
62
  const fetchData = React.useCallback(async ({ page, query }) => {
64
63
  if (query && getPosts) {
65
- const queryParamsForRequest = (0, common_2.getFeedQueryParams)(Object.assign(Object.assign({}, queryParams), query), page);
64
+ const queryParamsForRequest = (0, common_2.getFeedQueryParams)(Object.assign(Object.assign({}, queryParams), query), page, filters);
66
65
  const data = await getPosts(queryParamsForRequest);
67
66
  return data;
68
67
  }
69
68
  else {
70
69
  throw new Error('cant get request');
71
70
  }
72
- }, [getPosts, queryParams]);
71
+ }, [getPosts, queryParams, filters]);
73
72
  const handleLoad = React.useCallback(async ({ page, query }) => {
74
73
  const pageNumber = Number(page || queryParams.page || constants_2.DEFAULT_PAGE);
75
74
  handleChangeQueryParams(query);
@@ -143,16 +142,7 @@ const Feed = ({ image, title }) => {
143
142
  payload: loadedPostsCount < postCountOnPage,
144
143
  });
145
144
  }, [currentPage, lastLoadedCount, perPageInQuery, postCountOnPage]);
146
- const serviceItems = React.useMemo(() => services === null || services === void 0 ? void 0 : services.map((service) => ({
147
- content: service.name,
148
- value: `${service.id}`,
149
- })), [services]);
150
- const tagItems = React.useMemo(() => tags === null || tags === void 0 ? void 0 : tags.map((tag) => ({
151
- content: tag.name,
152
- value: tag.slug,
153
- icon: tag.icon && (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: tag.icon }),
154
- })), [tags]);
155
- return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(FeedHeader_1.FeedHeader, { verticalOffset: "s", tags: tagItems, services: serviceItems, handleLoadData: handleLoad, queryParams: queryParams, background: {
145
+ return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(FeedHeader_1.FeedHeader, { verticalOffset: "s", filters: filters, handleLoadData: handleLoad, queryParams: queryParams, background: {
156
146
  fullWidth: true,
157
147
  url: image,
158
148
  disableCompress: true,
@@ -1 +1 @@
1
- {"version":3,"file":"Feed.js","sourceRoot":"../../../../src","sources":["blocks/Feed/Feed.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport {useAnalytics} from '@gravity-ui/page-constructor';\nimport {Icon} from '@gravity-ui/uikit';\n\nimport {FeedHeader} from '../../components/FeedHeader/FeedHeader';\nimport {Posts} from '../../components/Posts/Posts';\nimport {PostsError} from '../../components/PostsError/PostsError';\nimport {DefaultGoalIds} from '../../constants';\nimport {FeedContext} from '../../contexts/FeedContext';\nimport {RouterContext} from '../../contexts/RouterContext';\nimport {AnalyticsCounter} from '../../counters/utils';\nimport {FeedProps} from '../../models/blocks';\nimport {DefaultEventNames, FetchArgs, HandleChangeQueryParams} from '../../models/common';\nimport {getFeedQueryParams, prepareAnalyticsEvent, scrollOnPageChange} from '../../utils/common';\nimport {DEFAULT_PAGE, DEFAULT_ROWS_PER_PAGE} from '../constants';\n\nimport {ActionTypes, reducer} from './reducer';\n\nconst CONTAINER_ID = 'blog-cards';\nconst PAGE_QUERY = 'page';\nconst FIRST_PAGE = 1;\n\nexport const Feed = ({image, title}: FeedProps) => {\n const {\n posts,\n totalCount,\n tags,\n services,\n pinnedPost,\n getPosts,\n pageCountForShowSupportButtons,\n } = React.useContext(FeedContext);\n const router = React.useContext(RouterContext);\n const handleAnalytics = useAnalytics(DefaultEventNames.ShowMore);\n const additionalAnalyticsEvent = prepareAnalyticsEvent({\n name: DefaultGoalIds.showMore,\n counter: AnalyticsCounter.CrossSite,\n });\n\n const [\n {\n errorLoad,\n errorShowMore,\n isFetching,\n isShowMoreVisible,\n lastLoadedCount,\n postCountOnPage,\n postsOnPage,\n pinnedPostOnPage,\n currentPage,\n queryParams,\n },\n dispatch,\n ] = React.useReducer(reducer, {\n errorLoad: false,\n errorShowMore: false,\n isFetching: false,\n isShowMoreVisible: true,\n lastLoadedCount: posts?.length || 0,\n postCountOnPage: totalCount || 0,\n postsOnPage: posts,\n pinnedPostOnPage: pinnedPost,\n currentPage: router?.query?.page ? Number(router.query.page) : DEFAULT_PAGE,\n queryParams: router.query || {},\n });\n\n const perPageInQuery = queryParams?.perPage\n ? Number(queryParams.perPage)\n : DEFAULT_ROWS_PER_PAGE;\n\n const pageChange = (value: number) => {\n dispatch({type: ActionTypes.PageChange, payload: value});\n };\n\n const setIsFetching = (value: boolean) => {\n dispatch({type: ActionTypes.SetIsFetching, payload: value});\n };\n\n const setErrorLoad = (value: boolean) => {\n dispatch({type: ActionTypes.SetErrorLoad, payload: value});\n };\n\n const handleChangeQueryParams: HandleChangeQueryParams = React.useCallback(\n (value) => {\n dispatch({type: ActionTypes.QueryParamsChange, payload: value});\n\n const hasFirstPageQuery = Object.keys(value).some(\n (queryKey) => queryKey === PAGE_QUERY && value[queryKey] === FIRST_PAGE,\n );\n\n const result = hasFirstPageQuery\n ? {\n ...value,\n [PAGE_QUERY]: null,\n }\n : {\n ...value,\n };\n\n router.updateQueryCallback(result);\n },\n [router],\n );\n\n const fetchData = React.useCallback(\n async ({page, query}: FetchArgs) => {\n if (query && getPosts) {\n const queryParamsForRequest = getFeedQueryParams({...queryParams, ...query}, page);\n const data = await getPosts(queryParamsForRequest);\n\n return data;\n } else {\n throw new Error('cant get request');\n }\n },\n [getPosts, queryParams],\n );\n\n const handleLoad = React.useCallback(\n async ({page, query}: FetchArgs) => {\n const pageNumber = Number(page || queryParams.page || DEFAULT_PAGE);\n\n handleChangeQueryParams(query);\n\n try {\n setErrorLoad(false);\n setIsFetching(true);\n\n const fetchedData = await fetchData({page: pageNumber, query});\n\n if (fetchedData) {\n dispatch({\n type: ActionTypes.SetPosts,\n payload: {\n posts: fetchedData.posts,\n pinnedPost: fetchedData.pinnedPost,\n count: fetchedData.count,\n page: pageNumber,\n },\n });\n }\n } catch (err) {\n setErrorLoad(true);\n }\n\n scrollOnPageChange(CONTAINER_ID);\n\n setIsFetching(false);\n },\n [fetchData, handleChangeQueryParams, queryParams],\n );\n\n const handlePageChange = async (value: number) => {\n pageChange(value);\n handleLoad({\n page: value,\n query: {...queryParams, page: value},\n });\n };\n\n const handleShowMore = async () => {\n handleAnalytics(additionalAnalyticsEvent);\n\n const nextPage = currentPage + 1;\n\n try {\n setIsFetching(true);\n const fetchedData = await fetchData({\n page: nextPage,\n query: {\n page: nextPage,\n },\n });\n\n handleChangeQueryParams({\n page: nextPage,\n });\n\n if (fetchedData) {\n dispatch({\n type: ActionTypes.SetShowMore,\n payload: {\n posts: (postsOnPage ?? []).concat(fetchedData.posts),\n count: fetchedData.count,\n currentPage: nextPage,\n lastLoadedCount: fetchedData.posts.length,\n },\n });\n }\n } catch (err) {\n dispatch({type: ActionTypes.SetErrorShowMore, payload: true});\n }\n\n setIsFetching(false);\n };\n\n const handleOnErrorReload = React.useCallback(() => {\n handleLoad({page: currentPage, query: queryParams});\n }, [currentPage, handleLoad, queryParams]);\n\n React.useEffect(() => {\n const loadedPostsCount = currentPage * perPageInQuery;\n dispatch({\n type: ActionTypes.SetIsShowMoreVisible,\n payload: loadedPostsCount < postCountOnPage,\n });\n }, [currentPage, lastLoadedCount, perPageInQuery, postCountOnPage]);\n\n const serviceItems = React.useMemo(\n () =>\n services?.map((service) => ({\n content: service.name,\n value: `${service.id}`,\n })),\n [services],\n );\n\n const tagItems = React.useMemo(\n () =>\n tags?.map((tag) => ({\n content: tag.name,\n value: tag.slug,\n icon: tag.icon && <Icon data={tag.icon} />,\n })),\n [tags],\n );\n\n return (\n <div>\n <FeedHeader\n verticalOffset=\"s\"\n tags={tagItems}\n services={serviceItems}\n handleLoadData={handleLoad}\n queryParams={queryParams}\n background={{\n fullWidth: true,\n url: image,\n disableCompress: true,\n }}\n title={title}\n />\n {errorLoad ? (\n <PostsError onButtonClick={handleOnErrorReload} />\n ) : (\n <Posts\n containerId={CONTAINER_ID}\n currentPage={currentPage}\n isShowMoreVisible={isShowMoreVisible}\n errorShowMore={errorShowMore}\n postCountOnPage={postCountOnPage}\n perPageInQuery={perPageInQuery}\n handleShowMore={handleShowMore}\n handlePageChange={handlePageChange}\n postsOnPage={postsOnPage}\n pinnedPostOnPage={pinnedPostOnPage}\n isFetching={isFetching}\n queryParams={queryParams}\n pageCountForShowSupportButtons={pageCountForShowSupportButtons}\n />\n )}\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"Feed.js","sourceRoot":"../../../../src","sources":["blocks/Feed/Feed.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport {useAnalytics} from '@gravity-ui/page-constructor';\n\nimport {FeedHeader} from '../../components/FeedHeader/FeedHeader';\nimport {Posts} from '../../components/Posts/Posts';\nimport {PostsError} from '../../components/PostsError/PostsError';\nimport {DefaultGoalIds} from '../../constants';\nimport {FeedContext} from '../../contexts/FeedContext';\nimport {RouterContext} from '../../contexts/RouterContext';\nimport {AnalyticsCounter} from '../../counters/utils';\nimport {FeedProps} from '../../models/blocks';\nimport {DefaultEventNames, FetchArgs, HandleChangeQueryParams} from '../../models/common';\nimport {getFeedQueryParams, prepareAnalyticsEvent, scrollOnPageChange} from '../../utils/common';\nimport {DEFAULT_PAGE, DEFAULT_ROWS_PER_PAGE} from '../constants';\n\nimport {ActionTypes, reducer} from './reducer';\n\nconst CONTAINER_ID = 'blog-cards';\nconst PAGE_QUERY = 'page';\nconst FIRST_PAGE = 1;\n\nexport const Feed = ({image, title}: FeedProps) => {\n const {posts, totalCount, filters, pinnedPost, getPosts, pageCountForShowSupportButtons} =\n React.useContext(FeedContext);\n const router = React.useContext(RouterContext);\n const handleAnalytics = useAnalytics(DefaultEventNames.ShowMore);\n const additionalAnalyticsEvent = prepareAnalyticsEvent({\n name: DefaultGoalIds.showMore,\n counter: AnalyticsCounter.CrossSite,\n });\n\n const [\n {\n errorLoad,\n errorShowMore,\n isFetching,\n isShowMoreVisible,\n lastLoadedCount,\n postCountOnPage,\n postsOnPage,\n pinnedPostOnPage,\n currentPage,\n queryParams,\n },\n dispatch,\n ] = React.useReducer(reducer, {\n errorLoad: false,\n errorShowMore: false,\n isFetching: false,\n isShowMoreVisible: true,\n lastLoadedCount: posts?.length || 0,\n postCountOnPage: totalCount || 0,\n postsOnPage: posts,\n pinnedPostOnPage: pinnedPost,\n currentPage: router?.query?.page ? Number(router.query.page) : DEFAULT_PAGE,\n queryParams: router.query || {},\n });\n\n const perPageInQuery = queryParams?.perPage\n ? Number(queryParams.perPage)\n : DEFAULT_ROWS_PER_PAGE;\n\n const pageChange = (value: number) => {\n dispatch({type: ActionTypes.PageChange, payload: value});\n };\n\n const setIsFetching = (value: boolean) => {\n dispatch({type: ActionTypes.SetIsFetching, payload: value});\n };\n\n const setErrorLoad = (value: boolean) => {\n dispatch({type: ActionTypes.SetErrorLoad, payload: value});\n };\n\n const handleChangeQueryParams: HandleChangeQueryParams = React.useCallback(\n (value) => {\n dispatch({type: ActionTypes.QueryParamsChange, payload: value});\n\n const hasFirstPageQuery = Object.keys(value).some(\n (queryKey) => queryKey === PAGE_QUERY && value[queryKey] === FIRST_PAGE,\n );\n\n const result = hasFirstPageQuery\n ? {\n ...value,\n [PAGE_QUERY]: null,\n }\n : {\n ...value,\n };\n\n router.updateQueryCallback(result);\n },\n [router],\n );\n\n const fetchData = React.useCallback(\n async ({page, query}: FetchArgs) => {\n if (query && getPosts) {\n const queryParamsForRequest = getFeedQueryParams(\n {...queryParams, ...query},\n page,\n filters,\n );\n const data = await getPosts(queryParamsForRequest);\n\n return data;\n } else {\n throw new Error('cant get request');\n }\n },\n [getPosts, queryParams, filters],\n );\n\n const handleLoad = React.useCallback(\n async ({page, query}: FetchArgs) => {\n const pageNumber = Number(page || queryParams.page || DEFAULT_PAGE);\n\n handleChangeQueryParams(query);\n\n try {\n setErrorLoad(false);\n setIsFetching(true);\n\n const fetchedData = await fetchData({page: pageNumber, query});\n\n if (fetchedData) {\n dispatch({\n type: ActionTypes.SetPosts,\n payload: {\n posts: fetchedData.posts,\n pinnedPost: fetchedData.pinnedPost,\n count: fetchedData.count,\n page: pageNumber,\n },\n });\n }\n } catch (err) {\n setErrorLoad(true);\n }\n\n scrollOnPageChange(CONTAINER_ID);\n\n setIsFetching(false);\n },\n [fetchData, handleChangeQueryParams, queryParams],\n );\n\n const handlePageChange = async (value: number) => {\n pageChange(value);\n handleLoad({\n page: value,\n query: {...queryParams, page: value},\n });\n };\n\n const handleShowMore = async () => {\n handleAnalytics(additionalAnalyticsEvent);\n\n const nextPage = currentPage + 1;\n\n try {\n setIsFetching(true);\n const fetchedData = await fetchData({\n page: nextPage,\n query: {\n page: nextPage,\n },\n });\n\n handleChangeQueryParams({\n page: nextPage,\n });\n\n if (fetchedData) {\n dispatch({\n type: ActionTypes.SetShowMore,\n payload: {\n posts: (postsOnPage ?? []).concat(fetchedData.posts),\n count: fetchedData.count,\n currentPage: nextPage,\n lastLoadedCount: fetchedData.posts.length,\n },\n });\n }\n } catch (err) {\n dispatch({type: ActionTypes.SetErrorShowMore, payload: true});\n }\n\n setIsFetching(false);\n };\n\n const handleOnErrorReload = React.useCallback(() => {\n handleLoad({page: currentPage, query: queryParams});\n }, [currentPage, handleLoad, queryParams]);\n\n React.useEffect(() => {\n const loadedPostsCount = currentPage * perPageInQuery;\n dispatch({\n type: ActionTypes.SetIsShowMoreVisible,\n payload: loadedPostsCount < postCountOnPage,\n });\n }, [currentPage, lastLoadedCount, perPageInQuery, postCountOnPage]);\n\n return (\n <div>\n <FeedHeader\n verticalOffset=\"s\"\n filters={filters}\n handleLoadData={handleLoad}\n queryParams={queryParams}\n background={{\n fullWidth: true,\n url: image,\n disableCompress: true,\n }}\n title={title}\n />\n {errorLoad ? (\n <PostsError onButtonClick={handleOnErrorReload} />\n ) : (\n <Posts\n containerId={CONTAINER_ID}\n currentPage={currentPage}\n isShowMoreVisible={isShowMoreVisible}\n errorShowMore={errorShowMore}\n postCountOnPage={postCountOnPage}\n perPageInQuery={perPageInQuery}\n handleShowMore={handleShowMore}\n handlePageChange={handlePageChange}\n postsOnPage={postsOnPage}\n pinnedPostOnPage={pinnedPostOnPage}\n isFetching={isFetching}\n queryParams={queryParams}\n pageCountForShowSupportButtons={pageCountForShowSupportButtons}\n />\n )}\n </div>\n );\n};\n"]}
@@ -3,5 +3,5 @@ import { ControlsProps } from "./components/Controls/Controls.js";
3
3
  type HeaderProps = Pick<HeaderBlockProps, 'background' | 'offset' | 'theme' | 'verticalOffset'>;
4
4
  type FeedHeaderProps = HeaderProps & ControlsProps;
5
5
  type FeedHeaderContainerProps = FeedHeaderProps & ClassNameProps;
6
- export declare const FeedHeader: ({ tags, services, handleLoadData, offset, background, theme, verticalOffset, className, queryParams, title, }: FeedHeaderContainerProps) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const FeedHeader: ({ filters, handleLoadData, offset, background, theme, verticalOffset, className, queryParams, title, }: FeedHeaderContainerProps) => import("react/jsx-runtime").JSX.Element;
7
7
  export {};
@@ -6,13 +6,13 @@ const page_constructor_1 = require("@gravity-ui/page-constructor");
6
6
  const cn_1 = require("../../utils/cn.js");
7
7
  const Controls_1 = require("./components/Controls/Controls.js");
8
8
  const b = (0, cn_1.block)('feed-header');
9
- const FeedHeader = ({ tags, services, handleLoadData, offset = 'default', background, theme = 'light', verticalOffset = 'l', className, queryParams, title, }) => {
9
+ const FeedHeader = ({ filters, handleLoadData, offset = 'default', background, theme = 'light', verticalOffset = 'l', className, queryParams, title, }) => {
10
10
  const backgroundThemed = background && (0, page_constructor_1.getThemedValue)(background, theme);
11
11
  return ((0, jsx_runtime_1.jsxs)("header", { className: b('header', { ['has-background']: Boolean(background) }, className), children: [(backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color) ? ((0, jsx_runtime_1.jsx)(page_constructor_1.FullWidthBackground, { style: { backgroundColor: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color }, theme: "rounded" })) : null, (0, jsx_runtime_1.jsxs)(page_constructor_1.Grid, { className: b('content', { offset, theme, 'vertical-offset': verticalOffset }), children: [backgroundThemed ? ((0, jsx_runtime_1.jsx)(page_constructor_1.BackgroundImage, { src: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.url, className: b('background'), imageClassName: b('background-img'), style: {
12
12
  backgroundColor: backgroundThemed.fullWidth
13
13
  ? ''
14
14
  : backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color,
15
- }, disableCompress: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.disableCompress })) : null, (0, jsx_runtime_1.jsx)(Controls_1.Controls, { title: title, tags: tags, services: services, handleLoadData: handleLoadData, queryParams: queryParams })] })] }));
15
+ }, disableCompress: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.disableCompress })) : null, (0, jsx_runtime_1.jsx)(Controls_1.Controls, { title: title, filters: filters, handleLoadData: handleLoadData, queryParams: queryParams })] })] }));
16
16
  };
17
17
  exports.FeedHeader = FeedHeader;
18
18
  //# sourceMappingURL=FeedHeader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeedHeader.js","sourceRoot":"../../../../src","sources":["components/FeedHeader/FeedHeader.tsx"],"names":[],"mappings":";;;;AAAA,mEAMsC;AAGtC,0CAAqC;AAErC,gEAAuE;AAIvE,MAAM,CAAC,GAAG,IAAA,UAAK,EAAC,aAAa,CAAC,CAAC;AAQxB,MAAM,UAAU,GAAG,CAAC,EACvB,IAAI,EACJ,QAAQ,EACR,cAAc,EACd,MAAM,GAAG,SAAS,EAClB,UAAU,EACV,KAAK,GAAG,OAAO,EACf,cAAc,GAAG,GAAG,EACpB,SAAS,EACT,WAAW,EACX,KAAK,GACkB,EAAE,EAAE;IAC3B,MAAM,gBAAgB,GAAG,UAAU,IAAI,IAAA,iCAAc,EAAC,UAAU,EAAE,KAAc,CAAC,CAAC;IAElF,OAAO,CACH,oCAAQ,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAC,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,EAAC,EAAE,SAAS,CAAC,aAC/E,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,KAAK,EAAC,CAAC,CAAC,CACvB,uBAAC,sCAAmB,IAChB,KAAK,EAAE,EAAC,eAAe,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,KAAK,EAAC,EACjD,KAAK,EAAC,SAAS,GACjB,CACL,CAAC,CAAC,CAAC,IAAI,EACR,wBAAC,uBAAI,IAAC,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,EAAC,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAC,CAAC,aAC5E,gBAAgB,CAAC,CAAC,CAAC,CAChB,uBAAC,kCAAe,IACZ,GAAG,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,GAAG,EAC1B,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,EAC1B,cAAc,EAAE,CAAC,CAAC,gBAAgB,CAAC,EACnC,KAAK,EAAE;4BACH,eAAe,EAAE,gBAAgB,CAAC,SAAS;gCACvC,CAAC,CAAC,EAAE;gCACJ,CAAC,CAAC,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,KAAK;yBAChC,EACD,eAAe,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,eAAe,GACpD,CACL,CAAC,CAAC,CAAC,IAAI,EACR,uBAAC,mBAAQ,IACL,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,GAC1B,IACC,IACF,CACZ,CAAC;AACN,CAAC,CAAC;AA9CW,QAAA,UAAU,cA8CrB","sourcesContent":["import {\n BackgroundImage,\n FullWidthBackground,\n Grid,\n Theme,\n getThemedValue,\n} from '@gravity-ui/page-constructor';\n\nimport {ClassNameProps, HeaderBlockProps} from '../../models/common';\nimport {block} from '../../utils/cn';\n\nimport {Controls, ControlsProps} from './components/Controls/Controls';\n\nimport './FeedHeader.scss';\n\nconst b = block('feed-header');\n\ntype HeaderProps = Pick<HeaderBlockProps, 'background' | 'offset' | 'theme' | 'verticalOffset'>;\n\ntype FeedHeaderProps = HeaderProps & ControlsProps;\n\ntype FeedHeaderContainerProps = FeedHeaderProps & ClassNameProps;\n\nexport const FeedHeader = ({\n tags,\n services,\n handleLoadData,\n offset = 'default',\n background,\n theme = 'light',\n verticalOffset = 'l',\n className,\n queryParams,\n title,\n}: FeedHeaderContainerProps) => {\n const backgroundThemed = background && getThemedValue(background, theme as Theme);\n\n return (\n <header className={b('header', {['has-background']: Boolean(background)}, className)}>\n {backgroundThemed?.color ? (\n <FullWidthBackground\n style={{backgroundColor: backgroundThemed?.color}}\n theme=\"rounded\"\n />\n ) : null}\n <Grid className={b('content', {offset, theme, 'vertical-offset': verticalOffset})}>\n {backgroundThemed ? (\n <BackgroundImage\n src={backgroundThemed?.url}\n className={b('background')}\n imageClassName={b('background-img')}\n style={{\n backgroundColor: backgroundThemed.fullWidth\n ? ''\n : backgroundThemed?.color,\n }}\n disableCompress={backgroundThemed?.disableCompress}\n />\n ) : null}\n <Controls\n title={title}\n tags={tags}\n services={services}\n handleLoadData={handleLoadData}\n queryParams={queryParams}\n />\n </Grid>\n </header>\n );\n};\n"]}
1
+ {"version":3,"file":"FeedHeader.js","sourceRoot":"../../../../src","sources":["components/FeedHeader/FeedHeader.tsx"],"names":[],"mappings":";;;;AAAA,mEAMsC;AAGtC,0CAAqC;AAErC,gEAAuE;AAIvE,MAAM,CAAC,GAAG,IAAA,UAAK,EAAC,aAAa,CAAC,CAAC;AAQxB,MAAM,UAAU,GAAG,CAAC,EACvB,OAAO,EACP,cAAc,EACd,MAAM,GAAG,SAAS,EAClB,UAAU,EACV,KAAK,GAAG,OAAO,EACf,cAAc,GAAG,GAAG,EACpB,SAAS,EACT,WAAW,EACX,KAAK,GACkB,EAAE,EAAE;IAC3B,MAAM,gBAAgB,GAAG,UAAU,IAAI,IAAA,iCAAc,EAAC,UAAU,EAAE,KAAc,CAAC,CAAC;IAElF,OAAO,CACH,oCAAQ,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAC,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,EAAC,EAAE,SAAS,CAAC,aAC/E,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,KAAK,EAAC,CAAC,CAAC,CACvB,uBAAC,sCAAmB,IAChB,KAAK,EAAE,EAAC,eAAe,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,KAAK,EAAC,EACjD,KAAK,EAAC,SAAS,GACjB,CACL,CAAC,CAAC,CAAC,IAAI,EACR,wBAAC,uBAAI,IAAC,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,EAAC,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAC,CAAC,aAC5E,gBAAgB,CAAC,CAAC,CAAC,CAChB,uBAAC,kCAAe,IACZ,GAAG,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,GAAG,EAC1B,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,EAC1B,cAAc,EAAE,CAAC,CAAC,gBAAgB,CAAC,EACnC,KAAK,EAAE;4BACH,eAAe,EAAE,gBAAgB,CAAC,SAAS;gCACvC,CAAC,CAAC,EAAE;gCACJ,CAAC,CAAC,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,KAAK;yBAChC,EACD,eAAe,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,eAAe,GACpD,CACL,CAAC,CAAC,CAAC,IAAI,EACR,uBAAC,mBAAQ,IACL,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,GAC1B,IACC,IACF,CACZ,CAAC;AACN,CAAC,CAAC;AA5CW,QAAA,UAAU,cA4CrB","sourcesContent":["import {\n BackgroundImage,\n FullWidthBackground,\n Grid,\n Theme,\n getThemedValue,\n} from '@gravity-ui/page-constructor';\n\nimport {ClassNameProps, HeaderBlockProps} from '../../models/common';\nimport {block} from '../../utils/cn';\n\nimport {Controls, ControlsProps} from './components/Controls/Controls';\n\nimport './FeedHeader.scss';\n\nconst b = block('feed-header');\n\ntype HeaderProps = Pick<HeaderBlockProps, 'background' | 'offset' | 'theme' | 'verticalOffset'>;\n\ntype FeedHeaderProps = HeaderProps & ControlsProps;\n\ntype FeedHeaderContainerProps = FeedHeaderProps & ClassNameProps;\n\nexport const FeedHeader = ({\n filters,\n handleLoadData,\n offset = 'default',\n background,\n theme = 'light',\n verticalOffset = 'l',\n className,\n queryParams,\n title,\n}: FeedHeaderContainerProps) => {\n const backgroundThemed = background && getThemedValue(background, theme as Theme);\n\n return (\n <header className={b('header', {['has-background']: Boolean(background)}, className)}>\n {backgroundThemed?.color ? (\n <FullWidthBackground\n style={{backgroundColor: backgroundThemed?.color}}\n theme=\"rounded\"\n />\n ) : null}\n <Grid className={b('content', {offset, theme, 'vertical-offset': verticalOffset})}>\n {backgroundThemed ? (\n <BackgroundImage\n src={backgroundThemed?.url}\n className={b('background')}\n imageClassName={b('background-img')}\n style={{\n backgroundColor: backgroundThemed.fullWidth\n ? ''\n : backgroundThemed?.color,\n }}\n disableCompress={backgroundThemed?.disableCompress}\n />\n ) : null}\n <Controls\n title={title}\n filters={filters}\n handleLoadData={handleLoadData}\n queryParams={queryParams}\n />\n </Grid>\n </header>\n );\n};\n"]}
@@ -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
  }
@@ -1,15 +1,8 @@
1
- import * as React from 'react';
2
- import { FetchArgs, Query } from "../../../../models/common.js";
3
- export type SelectItem = {
4
- content: string;
5
- value: string;
6
- icon?: React.ReactNode;
7
- };
1
+ import { FetchArgs, FilterConfig, Query } from "../../../../models/common.js";
8
2
  export type ControlsProps = {
9
3
  handleLoadData: (props: FetchArgs) => void;
10
- tags?: SelectItem[];
11
- services?: SelectItem[];
4
+ filters?: FilterConfig[];
12
5
  queryParams: Query;
13
6
  title?: string;
14
7
  };
15
- export declare const Controls: ({ handleLoadData, tags, services, queryParams, title, }: ControlsProps) => import("react/jsx-runtime").JSX.Element;
8
+ export declare const Controls: ({ handleLoadData, filters, queryParams, title, }: ControlsProps) => import("react/jsx-runtime").JSX.Element;
@@ -7,29 +7,21 @@ const React = tslib_1.__importStar(require("react"));
7
7
  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
- const constants_1 = require("../../../../constants.js");
11
10
  const LikesContext_1 = require("../../../../contexts/LikesContext.js");
12
- const MobileContext_1 = require("../../../../contexts/MobileContext.js");
13
- const utils_1 = require("../../../../counters/utils.js");
14
11
  const i18n_1 = require("../../../../i18n/index.js");
15
12
  const common_1 = require("../../../../models/common.js");
16
13
  const cn_1 = require("../../../../utils/cn.js");
17
- const common_2 = require("../../../../utils/common.js");
18
14
  const Search_1 = require("../../../Search/Search.js");
19
- const customRenders_1 = require("./customRenders.js");
15
+ const Filter_1 = require("../Filters/Filter.js");
20
16
  const b = (0, cn_1.block)('feed-controls');
21
17
  const ICON_SIZE = 16;
22
18
  const DEFAULT_PAGE = 1;
23
- const VIRTUALIZATION_THRESHOLD = 1000;
24
- const Controls = ({ handleLoadData, tags = [], services = [], queryParams, title = (0, i18n_1.i18n)(i18n_1.Keyset.Title), }) => {
19
+ const Controls = ({ handleLoadData, filters = [], queryParams, title = (0, i18n_1.i18n)(i18n_1.Keyset.Title), }) => {
25
20
  const { hasLikes } = React.useContext(LikesContext_1.LikesContext);
26
- const handleAnalyticsTag = (0, page_constructor_1.useAnalytics)(common_1.DefaultEventNames.Tag);
27
- const handleAnalyticsService = (0, page_constructor_1.useAnalytics)(common_1.DefaultEventNames.Service);
28
21
  const handleAnalyticsSaveOnly = (0, page_constructor_1.useAnalytics)(common_1.DefaultEventNames.SaveOnly);
29
- const { savedOnly: savedOnlyInitial, search: searchInitial, tags: tagInitial, services: servicesInitial, } = queryParams || {};
22
+ const { savedOnly: savedOnlyInitial, search: searchInitial } = queryParams || {};
30
23
  const [savedOnly, setSavedOnly] = React.useState(savedOnlyInitial === 'true');
31
24
  const [search, setSearch] = React.useState(searchInitial);
32
- const isMobile = React.useContext(MobileContext_1.MobileContext);
33
25
  const handleSavedOnly = () => {
34
26
  handleAnalyticsSaveOnly();
35
27
  setSavedOnly(!savedOnly);
@@ -38,9 +30,7 @@ const Controls = ({ handleLoadData, tags = [], services = [], queryParams, title
38
30
  query: {
39
31
  savedOnly: savedOnly ? '' : 'true',
40
32
  search: '',
41
- tags: '',
42
33
  page: DEFAULT_PAGE,
43
- services: '',
44
34
  },
45
35
  });
46
36
  };
@@ -51,55 +41,8 @@ const Controls = ({ handleLoadData, tags = [], services = [], queryParams, title
51
41
  query: { search: searchValue, page: DEFAULT_PAGE },
52
42
  });
53
43
  }, [handleLoadData]);
54
- const handleTagSelect = (selectedTags) => {
55
- const event = (0, common_2.prepareAnalyticsEvent)({
56
- name: constants_1.DefaultGoalIds.tag,
57
- counter: utils_1.AnalyticsCounter.CrossSite,
58
- });
59
- handleAnalyticsTag(event, {
60
- theme: selectedTags[0],
61
- });
62
- const isEmptyTag = selectedTags.some((tag) => tag === 'empty');
63
- handleLoadData({
64
- page: DEFAULT_PAGE,
65
- query: {
66
- tags: isEmptyTag ? '' : selectedTags[0],
67
- page: DEFAULT_PAGE,
68
- },
69
- });
70
- };
71
- const handleServicesSelect = (selectedServices) => {
72
- const forAnalyticsServices = services.filter((service) => {
73
- return selectedServices.includes(service.value);
74
- });
75
- const servicesAsStringForAnalytics = forAnalyticsServices
76
- .map((service) => service.content)
77
- .join(',');
78
- const event = (0, common_2.prepareAnalyticsEvent)({
79
- name: constants_1.DefaultGoalIds.service,
80
- counter: utils_1.AnalyticsCounter.CrossSite,
81
- });
82
- handleAnalyticsService(event, {
83
- service: servicesAsStringForAnalytics,
84
- });
85
- const servicesAsString = selectedServices.join(',');
86
- handleLoadData({
87
- page: DEFAULT_PAGE,
88
- query: { services: servicesAsString, page: DEFAULT_PAGE },
89
- });
90
- };
91
- const tagsItems = React.useMemo(() => [{ value: 'empty', content: (0, i18n_1.i18n)(i18n_1.Keyset.AllTags) }, ...tags], [tags]);
92
- const servicesItems = React.useMemo(() => (servicesInitial ? [...servicesInitial.split(',')] : []), [servicesInitial]);
93
- 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 }) }), (0, jsx_runtime_1.jsx)("div", { className: b('filter-item'), children: (0, jsx_runtime_1.jsx)(uikit_1.Select, { className: b('select'), size: "xl", options: tagsItems, defaultValue: [tagInitial], onUpdate: handleTagSelect, placeholder: (0, i18n_1.i18n)(i18n_1.Keyset.AllTags), popupClassName: b('popup', { isMobile }), renderControl: (0, customRenders_1.renderSwitcher)({
94
- initial: [tagInitial],
95
- list: tagsItems,
96
- defaultLabel: (0, i18n_1.i18n)(i18n_1.Keyset.AllTags),
97
- }), disablePortal: true, virtualizationThreshold: VIRTUALIZATION_THRESHOLD, renderOption: customRenders_1.renderOption }) }), services.length > 0 ? ((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: true, filterable: true, hasClear: true, disablePortal: true, options: services, defaultValue: servicesItems, popupClassName: b('popup', { isMobile }), onUpdate: handleServicesSelect, placeholder: (0, i18n_1.i18n)(i18n_1.Keyset.AllServices), renderControl: (0, customRenders_1.renderSwitcher)({
98
- initial: servicesItems,
99
- list: services,
100
- defaultLabel: (0, i18n_1.i18n)(i18n_1.Keyset.AllServices),
101
- qa: 'service-select',
102
- }), virtualizationThreshold: VIRTUALIZATION_THRESHOLD, renderOption: customRenders_1.renderOption, renderFilter: customRenders_1.renderFilter }) })) : null, 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] })] }) }));
103
46
  };
104
47
  exports.Controls = Controls;
105
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 {DefaultGoalIds} from '../../../../constants';\nimport {LikesContext} from '../../../../contexts/LikesContext';\nimport {MobileContext} from '../../../../contexts/MobileContext';\nimport {AnalyticsCounter} from '../../../../counters/utils';\nimport {Keyset, i18n} from '../../../../i18n';\nimport {DefaultEventNames, FetchArgs, Query} from '../../../../models/common';\nimport {block} from '../../../../utils/cn';\nimport {prepareAnalyticsEvent} from '../../../../utils/common';\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 SelectItem = {\n content: string;\n value: string;\n icon?: React.ReactNode;\n};\n\nexport type ControlsProps = {\n handleLoadData: (props: FetchArgs) => void;\n tags?: SelectItem[];\n services?: SelectItem[];\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 tags = [],\n services = [],\n queryParams,\n title = i18n(Keyset.Title),\n}: ControlsProps) => {\n const {hasLikes} = React.useContext(LikesContext);\n const handleAnalyticsTag = useAnalytics(DefaultEventNames.Tag);\n const handleAnalyticsService = useAnalytics(DefaultEventNames.Service);\n const handleAnalyticsSaveOnly = useAnalytics(DefaultEventNames.SaveOnly);\n\n const {\n savedOnly: savedOnlyInitial,\n search: searchInitial,\n tags: tagInitial,\n services: servicesInitial,\n } = 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 tags: '',\n page: DEFAULT_PAGE,\n services: '',\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 handleTagSelect = (selectedTags: string[]) => {\n const event = prepareAnalyticsEvent({\n name: DefaultGoalIds.tag,\n counter: AnalyticsCounter.CrossSite,\n });\n handleAnalyticsTag(event, {\n theme: selectedTags[0],\n });\n\n const isEmptyTag = selectedTags.some((tag) => tag === 'empty');\n\n handleLoadData({\n page: DEFAULT_PAGE,\n query: {\n tags: isEmptyTag ? '' : selectedTags[0],\n page: DEFAULT_PAGE,\n },\n });\n };\n\n const handleServicesSelect = (selectedServices: string[]) => {\n const forAnalyticsServices = services.filter((service) => {\n return selectedServices.includes(service.value);\n });\n\n const servicesAsStringForAnalytics = forAnalyticsServices\n .map((service) => service.content)\n .join(',');\n\n const event = prepareAnalyticsEvent({\n name: DefaultGoalIds.service,\n counter: AnalyticsCounter.CrossSite,\n });\n handleAnalyticsService(event, {\n service: servicesAsStringForAnalytics,\n });\n\n const servicesAsString = selectedServices.join(',');\n\n handleLoadData({\n page: DEFAULT_PAGE,\n query: {services: servicesAsString, page: DEFAULT_PAGE},\n });\n };\n\n const tagsItems = React.useMemo(\n () => [{value: 'empty', content: i18n(Keyset.AllTags)} as unknown as SelectItem, ...tags],\n [tags],\n );\n\n const servicesItems = React.useMemo(\n () => (servicesInitial ? [...(servicesInitial as string).split(',')] : []),\n [servicesInitial],\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 <div className={b('filter-item')}>\n <Select\n className={b('select')}\n size=\"xl\"\n options={tagsItems}\n defaultValue={[tagInitial] as string[]}\n onUpdate={handleTagSelect}\n placeholder={i18n(Keyset.AllTags)}\n popupClassName={b('popup', {isMobile})}\n renderControl={renderSwitcher({\n initial: [tagInitial],\n list: tagsItems,\n defaultLabel: i18n(Keyset.AllTags),\n })}\n disablePortal\n virtualizationThreshold={VIRTUALIZATION_THRESHOLD}\n renderOption={renderOption}\n />\n </div>\n\n {services.length > 0 ? (\n <div className={b('filter-item')}>\n <Select\n className={b('select')}\n size=\"xl\"\n multiple\n filterable\n hasClear\n disablePortal\n options={services}\n defaultValue={servicesItems}\n popupClassName={b('popup', {isMobile})}\n onUpdate={handleServicesSelect}\n placeholder={i18n(Keyset.AllServices)}\n renderControl={renderSwitcher({\n initial: servicesItems,\n list: services,\n defaultLabel: i18n(Keyset.AllServices),\n qa: 'service-select',\n })}\n virtualizationThreshold={VIRTUALIZATION_THRESHOLD}\n renderOption={renderOption}\n renderFilter={renderFilter}\n />\n </div>\n ) : null}\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 "../Controls/Controls.js";
1
+ import { SelectOption, 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: SelectOption[];
13
12
  controlRef: RenderControlParameters['ref'];
14
13
  a11yProps: RenderControlA11yProps;
15
14
  qa?: string;
@@ -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;AAE/D,gDAA2C;AAK3C,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 {block} from '../../../../utils/cn';\nimport {SelectItem} from '../Controls/Controls';\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,6CAA6E;AAE7E,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, SelectOption, SelectProps, useUniqId} 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: SelectOption[];\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"]}
@@ -0,0 +1,48 @@
1
+ /* use this for style redefinitions to awoid problems with
2
+ unpredictable css rules order in build */
3
+ .bc-feed-filter__select {
4
+ width: 100%;
5
+ }
6
+ .bc-feed-filter__select:hover {
7
+ width: 100%;
8
+ }
9
+ .bc-feed-filter__popup.bc-feed-filter__popup {
10
+ max-height: 500px;
11
+ border-radius: 12px;
12
+ }
13
+ .bc-feed-filter__popup.bc-feed-filter__popup .g-select-list::-webkit-scrollbar {
14
+ display: none;
15
+ }
16
+ .bc-feed-filter__popup.bc-feed-filter__popup .g-select-list .g-list {
17
+ max-height: calc(500px - var(--g-text-body-3-line-height) - 12px);
18
+ }
19
+ .bc-feed-filter__popup.bc-feed-filter__popup .g-list__item {
20
+ margin: 4px;
21
+ border-radius: 8px;
22
+ }
23
+
24
+ .bc-feed-filter__popup_isMobile .bc-feed-filter__popup-filter {
25
+ position: relative;
26
+ border: none;
27
+ }
28
+ .bc-feed-filter__popup_isMobile .bc-feed-filter__popup-filter::before {
29
+ content: "";
30
+ position: absolute;
31
+ left: 50%;
32
+ bottom: 0px;
33
+ border-bottom: 2px solid var(--g-color-line-generic);
34
+ border-bottom-right-radius: 0;
35
+ border-bottom-left-radius: 0;
36
+ width: 100%;
37
+ height: 2px;
38
+ transform: translateX(-50%);
39
+ }
40
+ .bc-feed-filter__popup-filter {
41
+ font-size: var(--g-text-body-2-font-size);
42
+ line-height: var(--g-text-body-2-line-height);
43
+ padding: 4px 12px;
44
+ border: none;
45
+ border-bottom: 1px solid var(--g-color-line-generic);
46
+ border-bottom-right-radius: 0;
47
+ border-bottom-left-radius: 0;
48
+ }
@@ -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,50 @@
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, multiple, filterable, hasClear, options, allLabel, placeholder, qa, analyticsEvents, } = filter;
18
+ const handleFilterSelect = (selectedValues) => {
19
+ if (analyticsEvents) {
20
+ handleAnalyticsFilter(analyticsEvents);
21
+ }
22
+ const query = {};
23
+ if (multiple) {
24
+ query[queryParamName] = selectedValues.join(',');
25
+ }
26
+ else {
27
+ const isEmpty = selectedValues.some((v) => v === 'empty');
28
+ query[queryParamName] = isEmpty ? '' : selectedValues[0];
29
+ }
30
+ onSelect(query);
31
+ };
32
+ let defaultValue;
33
+ if (multiple) {
34
+ defaultValue = initialValue ? initialValue.split(',') : [];
35
+ }
36
+ else {
37
+ defaultValue = [initialValue];
38
+ }
39
+ const optionsWithEmpty = multiple
40
+ ? options
41
+ : [{ value: 'empty', content: allLabel }, ...options];
42
+ 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)({
43
+ initial: defaultValue,
44
+ list: optionsWithEmpty,
45
+ defaultLabel: allLabel,
46
+ qa,
47
+ }), virtualizationThreshold: VIRTUALIZATION_THRESHOLD, renderOption: customRenders_1.renderOption, renderFilter: filterable ? (0, customRenders_1.renderFilter)({ className: b('popup-filter') }) : undefined }) }));
48
+ };
49
+ exports.Filter = Filter;
50
+ //# sourceMappingURL=Filter.js.map