@gravity-ui/blog-constructor 9.1.1 → 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 (65) 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 +4 -1
  13. package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js.map +1 -1
  14. package/build/cjs/components/FeedHeader/components/Filters/Filter.css +53 -0
  15. package/build/cjs/components/FeedHeader/components/Filters/Filter.d.ts +8 -0
  16. package/build/cjs/components/FeedHeader/components/Filters/Filter.js +61 -0
  17. package/build/cjs/components/FeedHeader/components/Filters/Filter.js.map +1 -0
  18. package/build/cjs/components/FeedHeader/components/{Controls → Filters}/customRenders.d.ts +3 -1
  19. package/build/cjs/components/FeedHeader/components/{Controls → Filters}/customRenders.js +4 -4
  20. package/build/cjs/components/FeedHeader/components/Filters/customRenders.js.map +1 -0
  21. package/build/cjs/components/Search/Search.css +1 -1
  22. package/build/cjs/containers/BlogPage/BlogPage.d.ts +3 -4
  23. package/build/cjs/containers/BlogPage/BlogPage.js +2 -3
  24. package/build/cjs/containers/BlogPage/BlogPage.js.map +1 -1
  25. package/build/cjs/contexts/FeedContext.d.ts +2 -3
  26. package/build/cjs/contexts/FeedContext.js.map +1 -1
  27. package/build/cjs/models/common.d.ts +26 -10
  28. package/build/cjs/models/common.js.map +1 -1
  29. package/build/cjs/utils/common.d.ts +2 -2
  30. package/build/cjs/utils/common.js +8 -4
  31. package/build/cjs/utils/common.js.map +1 -1
  32. package/build/esm/blocks/Feed/Feed.js +4 -14
  33. package/build/esm/blocks/Feed/Feed.js.map +1 -1
  34. package/build/esm/components/FeedHeader/FeedHeader.d.ts +1 -1
  35. package/build/esm/components/FeedHeader/FeedHeader.js +2 -2
  36. package/build/esm/components/FeedHeader/FeedHeader.js.map +1 -1
  37. package/build/esm/components/FeedHeader/components/Controls/Controls.css +14 -60
  38. package/build/esm/components/FeedHeader/components/Controls/Controls.d.ts +3 -10
  39. package/build/esm/components/FeedHeader/components/Controls/Controls.js +6 -63
  40. package/build/esm/components/FeedHeader/components/Controls/Controls.js.map +1 -1
  41. package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.d.ts +2 -3
  42. package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js +5 -2
  43. package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js.map +1 -1
  44. package/build/esm/components/FeedHeader/components/Filters/Filter.css +53 -0
  45. package/build/esm/components/FeedHeader/components/Filters/Filter.d.ts +9 -0
  46. package/build/esm/components/FeedHeader/components/Filters/Filter.js +57 -0
  47. package/build/esm/components/FeedHeader/components/Filters/Filter.js.map +1 -0
  48. package/build/esm/components/FeedHeader/components/{Controls → Filters}/customRenders.d.ts +3 -2
  49. package/build/esm/components/FeedHeader/components/{Controls → Filters}/customRenders.js +4 -5
  50. package/build/esm/components/FeedHeader/components/Filters/customRenders.js.map +1 -0
  51. package/build/esm/components/Search/Search.css +1 -1
  52. package/build/esm/containers/BlogPage/BlogPage.d.ts +3 -4
  53. package/build/esm/containers/BlogPage/BlogPage.js +2 -3
  54. package/build/esm/containers/BlogPage/BlogPage.js.map +1 -1
  55. package/build/esm/contexts/FeedContext.d.ts +2 -3
  56. package/build/esm/contexts/FeedContext.js.map +1 -1
  57. package/build/esm/models/common.d.ts +26 -10
  58. package/build/esm/models/common.js.map +1 -1
  59. package/build/esm/utils/common.d.ts +2 -2
  60. package/build/esm/utils/common.js +8 -4
  61. package/build/esm/utils/common.js.map +1 -1
  62. package/package.json +1 -1
  63. package/server/models/common.d.ts +26 -10
  64. package/build/cjs/components/FeedHeader/components/Controls/customRenders.js.map +0 -1
  65. package/build/esm/components/FeedHeader/components/Controls/customRenders.js.map +0 -1
@@ -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,11 +1,10 @@
1
1
  import * as React from 'react';
2
2
  import { CustomConfig, NavigationData, PageConstructorProviderProps, PageContent } from '@gravity-ui/page-constructor';
3
- import { GetPostsType, MetaProps, PostsProps, Service, Tag, ToggleLikeCallbackType } from "../../models/common.js";
3
+ import { FilterConfig, GetPostsType, MetaProps, PostsProps, ToggleLikeCallbackType } from "../../models/common.js";
4
4
  export type BlogPageProps = {
5
5
  content: PageContent;
6
6
  posts: PostsProps;
7
- tags: Tag[];
8
- services?: Service[];
7
+ filters?: FilterConfig[];
9
8
  navigation?: NavigationData;
10
9
  getPosts: GetPostsType;
11
10
  hasLikes?: boolean;
@@ -17,4 +16,4 @@ export type BlogPageProps = {
17
16
  isSignedInUser?: boolean;
18
17
  onClickSignIn?: React.EventHandler<React.SyntheticEvent>;
19
18
  };
20
- export declare const BlogPage: ({ content, posts, tags, services, getPosts, metaData, custom, hasLikes, toggleLike, navigation, settings, pageCountForShowSupportButtons, isSignedInUser, onClickSignIn, }: BlogPageProps) => import("react/jsx-runtime").JSX.Element;
19
+ export declare const BlogPage: ({ content, posts, filters, getPosts, metaData, custom, hasLikes, toggleLike, navigation, settings, pageCountForShowSupportButtons, isSignedInUser, onClickSignIn, }: BlogPageProps) => import("react/jsx-runtime").JSX.Element;
@@ -12,7 +12,7 @@ const FeedContext_1 = require("../../contexts/FeedContext.js");
12
12
  const LikesContext_1 = require("../../contexts/LikesContext.js");
13
13
  const SettingsContext_1 = require("../../contexts/SettingsContext.js");
14
14
  const useExtendedComponentMap_1 = require("../../hooks/useExtendedComponentMap.js");
15
- const BlogPage = ({ content, posts, tags, services, getPosts, metaData, custom, hasLikes = false, toggleLike, navigation, settings, pageCountForShowSupportButtons, isSignedInUser = false, onClickSignIn, }) => {
15
+ const BlogPage = ({ content, posts, filters, getPosts, metaData, custom, hasLikes = false, toggleLike, navigation, settings, pageCountForShowSupportButtons, isSignedInUser = false, onClickSignIn, }) => {
16
16
  const { isAnimationEnabled } = React.useContext(SettingsContext_1.SettingsContext);
17
17
  const _a = (0, usePromptSignInProps_1.usePromptSignInProps)(onClickSignIn), { requireSignIn } = _a, promptSignInProps = tslib_1.__rest(_a, ["requireSignIn"]);
18
18
  const likesContextData = React.useMemo(() => ({ toggleLike, hasLikes, isSignedInUser, requireSignIn }), [toggleLike, hasLikes, isSignedInUser, requireSignIn]);
@@ -21,8 +21,7 @@ const BlogPage = ({ content, posts, tags, services, getPosts, metaData, custom,
21
21
  posts: posts.posts,
22
22
  pinnedPost: posts.pinnedPost,
23
23
  totalCount: posts.count,
24
- tags,
25
- services: services !== null && services !== void 0 ? services : [],
24
+ filters,
26
25
  getPosts,
27
26
  pageCountForShowSupportButtons,
28
27
  }, children: (0, jsx_runtime_1.jsxs)(page_constructor_1.PageConstructorProvider, Object.assign({}, settings, { projectSettings: Object.assign(Object.assign({}, ((settings === null || settings === void 0 ? void 0 : settings.projectSettings) || {})), { isAnimationEnabled }), children: [metaData ? (0, jsx_runtime_1.jsx)(MetaWrapper_1.MetaWrapper, Object.assign({}, metaData)) : null, (0, jsx_runtime_1.jsx)(page_constructor_1.PageConstructor, { content: content, custom: actualComponentMap, navigation: navigation })] })) }), (0, jsx_runtime_1.jsx)(PromptSignIn_1.PromptSignIn, Object.assign({}, promptSignInProps))] }));
@@ -1 +1 @@
1
- {"version":3,"file":"BlogPage.js","sourceRoot":"../../../../src","sources":["containers/BlogPage/BlogPage.tsx"],"names":[],"mappings":";;;;;AAAA,qDAA+B;AAE/B,mEAOsC;AAEtC,6EAAqE;AACrE,gFAAwE;AACxE,sGAA8F;AAC9F,+DAAuD;AACvD,iEAAyD;AACzD,uEAA+D;AAC/D,oFAA4E;AA8BrE,MAAM,QAAQ,GAAG,CAAC,EACrB,OAAO,EACP,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,GAAG,KAAK,EAChB,UAAU,EACV,UAAU,EACV,QAAQ,EACR,8BAA8B,EAC9B,cAAc,GAAG,KAAK,EACtB,aAAa,GACD,EAAE,EAAE;IAChB,MAAM,EAAC,kBAAkB,EAAC,GAAG,KAAK,CAAC,UAAU,CAAC,iCAAe,CAAC,CAAC;IAC/D,MAAM,KAAwC,IAAA,2CAAoB,EAAC,aAAa,CAAC,EAA3E,EAAC,aAAa,OAA6D,EAAxD,iBAAiB,sBAApC,iBAAqC,CAAsC,CAAC;IAElF,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAClC,GAAG,EAAE,CAAC,CAAC,EAAC,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAC,CAAC,EAC7D,CAAC,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,CACxD,CAAC;IAEF,MAAM,kBAAkB,GAAG,IAAA,iDAAuB,EAAC,MAAM,CAAC,CAAC;IAE3D,OAAO,CACH,wBAAC,2BAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,gBAAgB,aAC1C,uBAAC,yBAAW,CAAC,QAAQ,IACjB,KAAK,EAAE;oBACH,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,UAAU,EAAE,KAAK,CAAC,KAAK;oBACvB,IAAI;oBACJ,QAAQ,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,EAAE;oBACxB,QAAQ;oBACR,8BAA8B;iBACjC,YAED,wBAAC,0CAAuB,oBAChB,QAAQ,IACZ,eAAe,kCAAM,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,KAAI,EAAE,CAAC,KAAE,kBAAkB,gBAEzE,QAAQ,CAAC,CAAC,CAAC,uBAAC,yBAAW,oBAAK,QAAQ,EAAI,CAAC,CAAC,CAAC,IAAI,EAChD,uBAAC,kCAAe,IACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,UAAU,GACxB,KACoB,GACP,EACvB,uBAAC,2BAAY,oBAAK,iBAAiB,EAAI,IACnB,CAC3B,CAAC;AACN,CAAC,CAAC;AAtDW,QAAA,QAAQ,YAsDnB","sourcesContent":["import * as React from 'react';\n\nimport {\n CustomConfig,\n NavigationData,\n PageConstructor,\n PageConstructorProvider,\n PageConstructorProviderProps,\n PageContent,\n} from '@gravity-ui/page-constructor';\n\nimport {MetaWrapper} from '../../components/MetaWrapper/MetaWrapper';\nimport {PromptSignIn} from '../../components/PromptSignIn/PromptSignIn';\nimport {usePromptSignInProps} from '../../components/PromptSignIn/hooks/usePromptSignInProps';\nimport {FeedContext} from '../../contexts/FeedContext';\nimport {LikesContext} from '../../contexts/LikesContext';\nimport {SettingsContext} from '../../contexts/SettingsContext';\nimport {useExtendedComponentMap} from '../../hooks/useExtendedComponentMap';\nimport {\n GetPostsType,\n MetaProps,\n PostsProps,\n Service,\n Tag,\n ToggleLikeCallbackType,\n} from '../../models/common';\n\nimport './BlogPage.scss';\n\nexport type BlogPageProps = {\n content: PageContent;\n posts: PostsProps;\n tags: Tag[];\n services?: Service[];\n navigation?: NavigationData;\n getPosts: GetPostsType;\n hasLikes?: boolean;\n toggleLike?: ToggleLikeCallbackType;\n metaData?: MetaProps;\n settings?: PageConstructorProviderProps;\n custom?: CustomConfig;\n pageCountForShowSupportButtons?: number;\n isSignedInUser?: boolean;\n // Required to enable Sign In on Post like\n onClickSignIn?: React.EventHandler<React.SyntheticEvent>;\n};\n\nexport const BlogPage = ({\n content,\n posts,\n tags,\n services,\n getPosts,\n metaData,\n custom,\n hasLikes = false,\n toggleLike,\n navigation,\n settings,\n pageCountForShowSupportButtons,\n isSignedInUser = false,\n onClickSignIn,\n}: BlogPageProps) => {\n const {isAnimationEnabled} = React.useContext(SettingsContext);\n const {requireSignIn, ...promptSignInProps} = usePromptSignInProps(onClickSignIn);\n\n const likesContextData = React.useMemo(\n () => ({toggleLike, hasLikes, isSignedInUser, requireSignIn}),\n [toggleLike, hasLikes, isSignedInUser, requireSignIn],\n );\n\n const actualComponentMap = useExtendedComponentMap(custom);\n\n return (\n <LikesContext.Provider value={likesContextData}>\n <FeedContext.Provider\n value={{\n posts: posts.posts,\n pinnedPost: posts.pinnedPost,\n totalCount: posts.count,\n tags,\n services: services ?? [],\n getPosts,\n pageCountForShowSupportButtons,\n }}\n >\n <PageConstructorProvider\n {...settings}\n projectSettings={{...(settings?.projectSettings || {}), isAnimationEnabled}}\n >\n {metaData ? <MetaWrapper {...metaData} /> : null}\n <PageConstructor\n content={content}\n custom={actualComponentMap}\n navigation={navigation}\n />\n </PageConstructorProvider>\n </FeedContext.Provider>\n <PromptSignIn {...promptSignInProps} />\n </LikesContext.Provider>\n );\n};\n"]}
1
+ {"version":3,"file":"BlogPage.js","sourceRoot":"../../../../src","sources":["containers/BlogPage/BlogPage.tsx"],"names":[],"mappings":";;;;;AAAA,qDAA+B;AAE/B,mEAOsC;AAEtC,6EAAqE;AACrE,gFAAwE;AACxE,sGAA8F;AAC9F,+DAAuD;AACvD,iEAAyD;AACzD,uEAA+D;AAC/D,oFAA4E;AA4BrE,MAAM,QAAQ,GAAG,CAAC,EACrB,OAAO,EACP,KAAK,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,GAAG,KAAK,EAChB,UAAU,EACV,UAAU,EACV,QAAQ,EACR,8BAA8B,EAC9B,cAAc,GAAG,KAAK,EACtB,aAAa,GACD,EAAE,EAAE;IAChB,MAAM,EAAC,kBAAkB,EAAC,GAAG,KAAK,CAAC,UAAU,CAAC,iCAAe,CAAC,CAAC;IAC/D,MAAM,KAAwC,IAAA,2CAAoB,EAAC,aAAa,CAAC,EAA3E,EAAC,aAAa,OAA6D,EAAxD,iBAAiB,sBAApC,iBAAqC,CAAsC,CAAC;IAElF,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAClC,GAAG,EAAE,CAAC,CAAC,EAAC,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAC,CAAC,EAC7D,CAAC,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,CACxD,CAAC;IAEF,MAAM,kBAAkB,GAAG,IAAA,iDAAuB,EAAC,MAAM,CAAC,CAAC;IAE3D,OAAO,CACH,wBAAC,2BAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,gBAAgB,aAC1C,uBAAC,yBAAW,CAAC,QAAQ,IACjB,KAAK,EAAE;oBACH,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,UAAU,EAAE,KAAK,CAAC,KAAK;oBACvB,OAAO;oBACP,QAAQ;oBACR,8BAA8B;iBACjC,YAED,wBAAC,0CAAuB,oBAChB,QAAQ,IACZ,eAAe,kCAAM,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,KAAI,EAAE,CAAC,KAAE,kBAAkB,gBAEzE,QAAQ,CAAC,CAAC,CAAC,uBAAC,yBAAW,oBAAK,QAAQ,EAAI,CAAC,CAAC,CAAC,IAAI,EAChD,uBAAC,kCAAe,IACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,UAAU,GACxB,KACoB,GACP,EACvB,uBAAC,2BAAY,oBAAK,iBAAiB,EAAI,IACnB,CAC3B,CAAC;AACN,CAAC,CAAC;AApDW,QAAA,QAAQ,YAoDnB","sourcesContent":["import * as React from 'react';\n\nimport {\n CustomConfig,\n NavigationData,\n PageConstructor,\n PageConstructorProvider,\n PageConstructorProviderProps,\n PageContent,\n} from '@gravity-ui/page-constructor';\n\nimport {MetaWrapper} from '../../components/MetaWrapper/MetaWrapper';\nimport {PromptSignIn} from '../../components/PromptSignIn/PromptSignIn';\nimport {usePromptSignInProps} from '../../components/PromptSignIn/hooks/usePromptSignInProps';\nimport {FeedContext} from '../../contexts/FeedContext';\nimport {LikesContext} from '../../contexts/LikesContext';\nimport {SettingsContext} from '../../contexts/SettingsContext';\nimport {useExtendedComponentMap} from '../../hooks/useExtendedComponentMap';\nimport {\n FilterConfig,\n GetPostsType,\n MetaProps,\n PostsProps,\n ToggleLikeCallbackType,\n} from '../../models/common';\n\nimport './BlogPage.scss';\n\nexport type BlogPageProps = {\n content: PageContent;\n posts: PostsProps;\n filters?: FilterConfig[];\n navigation?: NavigationData;\n getPosts: GetPostsType;\n hasLikes?: boolean;\n toggleLike?: ToggleLikeCallbackType;\n metaData?: MetaProps;\n settings?: PageConstructorProviderProps;\n custom?: CustomConfig;\n pageCountForShowSupportButtons?: number;\n isSignedInUser?: boolean;\n // Required to enable Sign In on Post like\n onClickSignIn?: React.EventHandler<React.SyntheticEvent>;\n};\n\nexport const BlogPage = ({\n content,\n posts,\n filters,\n getPosts,\n metaData,\n custom,\n hasLikes = false,\n toggleLike,\n navigation,\n settings,\n pageCountForShowSupportButtons,\n isSignedInUser = false,\n onClickSignIn,\n}: BlogPageProps) => {\n const {isAnimationEnabled} = React.useContext(SettingsContext);\n const {requireSignIn, ...promptSignInProps} = usePromptSignInProps(onClickSignIn);\n\n const likesContextData = React.useMemo(\n () => ({toggleLike, hasLikes, isSignedInUser, requireSignIn}),\n [toggleLike, hasLikes, isSignedInUser, requireSignIn],\n );\n\n const actualComponentMap = useExtendedComponentMap(custom);\n\n return (\n <LikesContext.Provider value={likesContextData}>\n <FeedContext.Provider\n value={{\n posts: posts.posts,\n pinnedPost: posts.pinnedPost,\n totalCount: posts.count,\n filters,\n getPosts,\n pageCountForShowSupportButtons,\n }}\n >\n <PageConstructorProvider\n {...settings}\n projectSettings={{...(settings?.projectSettings || {}), isAnimationEnabled}}\n >\n {metaData ? <MetaWrapper {...metaData} /> : null}\n <PageConstructor\n content={content}\n custom={actualComponentMap}\n navigation={navigation}\n />\n </PageConstructorProvider>\n </FeedContext.Provider>\n <PromptSignIn {...promptSignInProps} />\n </LikesContext.Provider>\n );\n};\n"]}
@@ -1,11 +1,10 @@
1
1
  import * as React from 'react';
2
- import { GetPostsType, PostData, Service, Tag } from "../models/common.js";
2
+ import { FilterConfig, GetPostsType, PostData } from "../models/common.js";
3
3
  export interface FeedContextProps {
4
4
  posts?: PostData[];
5
5
  pinnedPost?: PostData;
6
6
  totalCount?: number;
7
- tags?: Tag[];
8
- services?: Service[];
7
+ filters?: FilterConfig[];
9
8
  getPosts?: GetPostsType;
10
9
  pageCountForShowSupportButtons?: number;
11
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FeedContext.js","sourceRoot":"../../../src","sources":["contexts/FeedContext.ts"],"names":[],"mappings":";;;;AAAA,qDAA+B;AAclB,QAAA,WAAW,GAAG,KAAK,CAAC,aAAa,CAAmB,EAAsB,CAAC,CAAC","sourcesContent":["import * as React from 'react';\n\nimport {GetPostsType, PostData, Service, Tag} from '../models/common';\n\nexport interface FeedContextProps {\n posts?: PostData[];\n pinnedPost?: PostData;\n totalCount?: number;\n tags?: Tag[];\n services?: Service[];\n getPosts?: GetPostsType;\n pageCountForShowSupportButtons?: number;\n}\n\nexport const FeedContext = React.createContext<FeedContextProps>({} as FeedContextProps);\n"]}
1
+ {"version":3,"file":"FeedContext.js","sourceRoot":"../../../src","sources":["contexts/FeedContext.ts"],"names":[],"mappings":";;;;AAAA,qDAA+B;AAalB,QAAA,WAAW,GAAG,KAAK,CAAC,aAAa,CAAmB,EAAsB,CAAC,CAAC","sourcesContent":["import * as React from 'react';\n\nimport {FilterConfig, GetPostsType, PostData} from '../models/common';\n\nexport interface FeedContextProps {\n posts?: PostData[];\n pinnedPost?: PostData;\n totalCount?: number;\n filters?: FilterConfig[];\n getPosts?: GetPostsType;\n pageCountForShowSupportButtons?: number;\n}\n\nexport const FeedContext = React.createContext<FeedContextProps>({} as FeedContextProps);\n"]}
@@ -1,6 +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';
3
+ import { AnalyticsEventsProp, HeaderBlockProps as PageConstructorHeaderBlockProps } from '@gravity-ui/page-constructor';
4
+ import { SelectOptions, SelectProps } from '@gravity-ui/uikit';
4
5
  import { IBrowser, IDevice } from 'ua-parser-js';
5
6
  import { Locale } from "./locale.js";
6
7
  export declare enum Theme {
@@ -23,13 +24,6 @@ export type Author = {
23
24
  } & {
24
25
  [x: string]: string | null;
25
26
  };
26
- export type Service = {
27
- id: number | string;
28
- slug: string;
29
- name: string;
30
- } & {
31
- [x: string]: string | null;
32
- };
33
27
  export type Query = Record<string, number | string | null>;
34
28
  export interface Menu {
35
29
  title: string;
@@ -143,12 +137,11 @@ export interface HeaderBlockProps extends PageConstructorHeaderBlockProps {
143
137
  };
144
138
  }
145
139
  export type GetPostsRequest = {
146
- tags: string | undefined;
147
140
  page: number;
148
141
  perPage: number;
149
142
  savedOnly: boolean;
150
143
  search: string | undefined;
151
- services: string | undefined;
144
+ [filterParam: string]: string | number | boolean | undefined;
152
145
  };
153
146
  export type GetPostsType = (query: GetPostsRequest) => Promise<PostsProps>;
154
147
  export type HandleChangeQueryParams = (params: Query) => void;
@@ -170,6 +163,28 @@ export type FetchArgs = {
170
163
  export interface QAProps {
171
164
  qa?: string;
172
165
  }
166
+ type FilterConfigBase = {
167
+ /** The key used in queryParams and passed to handleLoadData query */
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';
176
+ /** The selectable items for this filter */
177
+ options: SelectOptions;
178
+ /** Label shown when nothing is selected (acts as "All …" placeholder option in single mode) */
179
+ allLabel: string;
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;
173
188
  export declare enum PostCardSize {
174
189
  SMALL = "s",
175
190
  MEDIUM = "m"
@@ -181,3 +196,4 @@ export declare enum PostCardTitleHeadingLevel {
181
196
  export interface TransformPostOptions {
182
197
  plugins?: MarkdownItPluginCb[];
183
198
  }
199
+ export {};
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"../../../src","sources":["models/common.ts"],"names":[],"mappings":";;;AASA,IAAY,KAGX;AAHD,WAAY,KAAK;IACb,wBAAe,CAAA;IACf,sBAAa,CAAA;AACjB,CAAC,EAHW,KAAK,qBAAL,KAAK,QAGhB;AA2FD,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;AA+DD,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;AAWD,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 {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 Service = {\n id: number | string;\n slug: string;\n name: string;\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 tags: string | undefined;\n page: number;\n perPage: number;\n savedOnly: boolean;\n search: string | undefined;\n services: string | 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 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"]}
@@ -1,7 +1,7 @@
1
1
  import { AnalyticsEvent, AnalyticsEventsProp, ContentBlockProps, HeaderBreadCrumbsProps } from '@gravity-ui/page-constructor';
2
2
  import { RouterContextProps } from "../contexts/RouterContext.js";
3
3
  import { AnalyticsCounter } from "../counters/utils.js";
4
- import { GetPostsRequest, Query, Tag } from "../models/common.js";
4
+ import { FilterConfig, GetPostsRequest, Query, Tag } from "../models/common.js";
5
5
  export interface QueryParam {
6
6
  name: string;
7
7
  value?: string | number | null;
@@ -47,7 +47,7 @@ export declare const getMergedAnalyticsEvents: (analyticEvents: AnalyticsEventsP
47
47
  context?: string;
48
48
  target?: string;
49
49
  }[];
50
- export declare const getFeedQueryParams: (queryString: Query, pageNumber?: number) => GetPostsRequest;
50
+ export declare const getFeedQueryParams: (queryString: Query, pageNumber?: number, filters?: FilterConfig[]) => GetPostsRequest;
51
51
  export declare const scrollOnPageChange: (containerId: string) => void;
52
52
  export declare const getQaAttributes: (qa?: string, ...customKeys: (string | Array<string>)[]) => Record<string, string>;
53
53
  type PrepareAnalyticsEventArgs = {
@@ -89,15 +89,19 @@ const getMergedAnalyticsEvents = (analyticEvents, existringEvents) => {
89
89
  return eventsAsArray.concat(existingAsArray);
90
90
  };
91
91
  exports.getMergedAnalyticsEvents = getMergedAnalyticsEvents;
92
- const getFeedQueryParams = (queryString, pageNumber) => {
92
+ const getFeedQueryParams = (queryString, pageNumber, filters) => {
93
93
  const queryParams = (0, exports.getPageSearchParams)(queryString);
94
- const tags = queryParams.get('tags') || undefined;
95
94
  const page = pageNumber || Number(queryParams.get('page') || constants_1.DEFAULT_PAGE);
96
95
  const perPage = Number(queryParams.get('perPage') || constants_1.DEFAULT_ROWS_PER_PAGE);
97
96
  const savedOnly = queryParams.get('savedOnly') === 'true';
98
97
  const search = queryParams.get('search') || undefined;
99
- const serviceIds = queryParams.get('services') || undefined;
100
- return { tags, page, perPage, savedOnly, search, services: serviceIds };
98
+ const filterParams = {};
99
+ if (filters === null || filters === void 0 ? void 0 : filters.length) {
100
+ filters.forEach(({ queryParamName }) => {
101
+ filterParams[queryParamName] = queryParams.get(queryParamName) || undefined;
102
+ });
103
+ }
104
+ return Object.assign({ page, perPage, savedOnly, search }, filterParams);
101
105
  };
102
106
  exports.getFeedQueryParams = getFeedQueryParams;
103
107
  const scrollOnPageChange = (containerId) => {
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"../../../src","sources":["utils/common.ts"],"names":[],"mappings":"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","sourcesContent":["import {format, parse} from 'url';\n\nimport {\n AnalyticsEvent,\n AnalyticsEventsProp,\n ContentBlockProps,\n HeaderBreadCrumbsProps,\n} from '@gravity-ui/page-constructor';\nimport camelCase from 'lodash/camelCase';\nimport debounce from 'lodash/debounce';\nimport flatten from 'lodash/flatten';\nimport memoize from 'lodash/memoize';\n\nimport {\n CONTENT_DEFAULT_COL_SIZES,\n CONTENT_DEFAULT_SIZE,\n CONTENT_DEFAULT_THEME,\n DEFAULT_PAGE,\n DEFAULT_ROWS_PER_PAGE,\n} from '../blocks/constants';\nimport {RouterContextProps} from '../contexts/RouterContext';\nimport {AnalyticsCounter} from '../counters/utils';\nimport {Keyset, i18n} from '../i18n';\nimport {GetPostsRequest, Query, Tag} from '../models/common';\n\nconst QA_ATTRIBUTES_KEYS = ['container', 'content', 'wrapper', 'image', 'button'];\n\nexport interface QueryParam {\n name: string;\n value?: string | number | null;\n}\n\nexport interface RouterActionOptions {\n shallow?: boolean;\n}\n\nexport function getAbsolutePath(router: RouterContextProps, url?: string) {\n if (!router || !router.pathname) {\n return url ?? '';\n }\n\n const parsed = parse(url || router.as || '');\n\n return format({\n ...parsed,\n protocol: parsed.protocol || 'https',\n hostname: parsed.hostname || router.hostname,\n pathname: parsed.pathname || router.pathname,\n });\n}\n\nexport const getPageSearchParams = (query: Query = {}) => {\n const searchParams = new URLSearchParams();\n\n Object.entries(query).forEach(([key, value]) => {\n searchParams.set(key, String(value));\n });\n\n return searchParams;\n};\n\nexport const scrollToHash = (hash: string, browser?: string) => {\n if (!hash) {\n return;\n }\n\n const element = document.getElementById(hash);\n\n if (!element) {\n return;\n }\n\n setTimeout(\n () => element.scrollIntoView({behavior: browser === 'Yandex' ? 'auto' : 'smooth'}),\n 0,\n );\n};\n\ntype CloudListTagStub = {};\n\nexport const getTags = memoize((tags: Tag[], blogPath: string) => {\n return tags.map(({slug, ...tag}) => {\n const queryParams = new URLSearchParams();\n queryParams.set('tags', slug);\n\n return {\n ...tag,\n id: slug,\n url: `${blogPath}?${queryParams}`,\n } as CloudListTagStub;\n });\n});\n\nconst stub = (postId: number | string) => postId;\n\nexport const postLikeStatus = debounce((postId: number | string, hasUserLike: boolean) => {\n (hasUserLike ? stub : stub)(postId);\n}, 300);\n\nexport const updateContentSizes = ({size, colSizes, theme, ...contentData}: ContentBlockProps) => ({\n ...contentData,\n size: size || CONTENT_DEFAULT_SIZE,\n colSizes: colSizes || CONTENT_DEFAULT_COL_SIZES,\n theme: theme || CONTENT_DEFAULT_THEME,\n});\n\ntype GetBreadcrumbsProps = {\n tags?: Tag[];\n blogPath: string;\n};\n\nexport const getBlogPath = (pathPrefix: string) => {\n const prefix = pathPrefix ? `/${pathPrefix}` : '';\n return `${prefix}/blog`;\n};\n\nexport function getBreadcrumbs({tags, blogPath}: GetBreadcrumbsProps) {\n const breadcrumbs: HeaderBreadCrumbsProps = {\n items: [{text: i18n(Keyset.TitleBreadcrumbs), url: blogPath}],\n theme: 'light',\n };\n\n if (tags?.length) {\n const localizedTags = getTags(tags, blogPath);\n const tag = localizedTags[0];\n // @ts-ignore todo fix\n breadcrumbs.items.push({text: tag.name, url: tag.url});\n }\n\n return breadcrumbs;\n}\n\nconst getArrayOfEvents = (events?: AnalyticsEventsProp) => {\n if (!events) {\n return [];\n }\n\n if (Array.isArray(events)) {\n return events;\n }\n\n return [events];\n};\n\nexport const getMergedAnalyticsEvents = (\n analyticEvents: AnalyticsEventsProp,\n existringEvents?: AnalyticsEventsProp,\n) => {\n const eventsAsArray = getArrayOfEvents(analyticEvents);\n const existingAsArray = getArrayOfEvents(existringEvents);\n\n return eventsAsArray.concat(existingAsArray);\n};\n\nexport const getFeedQueryParams = (queryString: Query, pageNumber?: number): GetPostsRequest => {\n const queryParams = getPageSearchParams(queryString);\n const tags = queryParams.get('tags') || undefined;\n const page = pageNumber || Number(queryParams.get('page') || DEFAULT_PAGE);\n const perPage = Number(queryParams.get('perPage') || DEFAULT_ROWS_PER_PAGE);\n const savedOnly = queryParams.get('savedOnly') === 'true';\n const search = queryParams.get('search') || undefined;\n const serviceIds = queryParams.get('services') || undefined;\n\n return {tags, page, perPage, savedOnly, search, services: serviceIds};\n};\n\nexport const scrollOnPageChange = (containerId: string) => {\n const cardsContainerEl = document.getElementById(containerId);\n const y = cardsContainerEl?.getBoundingClientRect()?.y || 0;\n\n if (y < 0) {\n scrollToHash(containerId);\n }\n};\n\nexport const getQaAttributes = (qa?: string, ...customKeys: (string | Array<string>)[]) => {\n const attributes: Record<string, string> = {};\n\n if (qa) {\n const keys = QA_ATTRIBUTES_KEYS.concat(flatten(customKeys));\n\n keys.forEach((key) => {\n attributes[camelCase(key)] = `${qa}-${key}`;\n });\n\n attributes.default = qa;\n }\n\n return attributes;\n};\n\ntype PrepareAnalyticsEventArgs = {\n name: string;\n counter?: AnalyticsCounter;\n options?: Record<string, string | number>;\n};\n\nexport const prepareAnalyticsEvent = ({\n name,\n counter = AnalyticsCounter.Main,\n options = {},\n}: PrepareAnalyticsEventArgs): AnalyticsEvent => ({\n ...options,\n name,\n counters: {\n include: [counter],\n },\n});\n"]}
1
+ {"version":3,"file":"common.js","sourceRoot":"../../../src","sources":["utils/common.ts"],"names":[],"mappings":"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","sourcesContent":["import {format, parse} from 'url';\n\nimport {\n AnalyticsEvent,\n AnalyticsEventsProp,\n ContentBlockProps,\n HeaderBreadCrumbsProps,\n} from '@gravity-ui/page-constructor';\nimport camelCase from 'lodash/camelCase';\nimport debounce from 'lodash/debounce';\nimport flatten from 'lodash/flatten';\nimport memoize from 'lodash/memoize';\n\nimport {\n CONTENT_DEFAULT_COL_SIZES,\n CONTENT_DEFAULT_SIZE,\n CONTENT_DEFAULT_THEME,\n DEFAULT_PAGE,\n DEFAULT_ROWS_PER_PAGE,\n} from '../blocks/constants';\nimport {RouterContextProps} from '../contexts/RouterContext';\nimport {AnalyticsCounter} from '../counters/utils';\nimport {Keyset, i18n} from '../i18n';\nimport {FilterConfig, GetPostsRequest, Query, Tag} from '../models/common';\n\nconst QA_ATTRIBUTES_KEYS = ['container', 'content', 'wrapper', 'image', 'button'];\n\nexport interface QueryParam {\n name: string;\n value?: string | number | null;\n}\n\nexport interface RouterActionOptions {\n shallow?: boolean;\n}\n\nexport function getAbsolutePath(router: RouterContextProps, url?: string) {\n if (!router || !router.pathname) {\n return url ?? '';\n }\n\n const parsed = parse(url || router.as || '');\n\n return format({\n ...parsed,\n protocol: parsed.protocol || 'https',\n hostname: parsed.hostname || router.hostname,\n pathname: parsed.pathname || router.pathname,\n });\n}\n\nexport const getPageSearchParams = (query: Query = {}) => {\n const searchParams = new URLSearchParams();\n\n Object.entries(query).forEach(([key, value]) => {\n searchParams.set(key, String(value));\n });\n\n return searchParams;\n};\n\nexport const scrollToHash = (hash: string, browser?: string) => {\n if (!hash) {\n return;\n }\n\n const element = document.getElementById(hash);\n\n if (!element) {\n return;\n }\n\n setTimeout(\n () => element.scrollIntoView({behavior: browser === 'Yandex' ? 'auto' : 'smooth'}),\n 0,\n );\n};\n\ntype CloudListTagStub = {};\n\nexport const getTags = memoize((tags: Tag[], blogPath: string) => {\n return tags.map(({slug, ...tag}) => {\n const queryParams = new URLSearchParams();\n queryParams.set('tags', slug);\n\n return {\n ...tag,\n id: slug,\n url: `${blogPath}?${queryParams}`,\n } as CloudListTagStub;\n });\n});\n\nconst stub = (postId: number | string) => postId;\n\nexport const postLikeStatus = debounce((postId: number | string, hasUserLike: boolean) => {\n (hasUserLike ? stub : stub)(postId);\n}, 300);\n\nexport const updateContentSizes = ({size, colSizes, theme, ...contentData}: ContentBlockProps) => ({\n ...contentData,\n size: size || CONTENT_DEFAULT_SIZE,\n colSizes: colSizes || CONTENT_DEFAULT_COL_SIZES,\n theme: theme || CONTENT_DEFAULT_THEME,\n});\n\ntype GetBreadcrumbsProps = {\n tags?: Tag[];\n blogPath: string;\n};\n\nexport const getBlogPath = (pathPrefix: string) => {\n const prefix = pathPrefix ? `/${pathPrefix}` : '';\n return `${prefix}/blog`;\n};\n\nexport function getBreadcrumbs({tags, blogPath}: GetBreadcrumbsProps) {\n const breadcrumbs: HeaderBreadCrumbsProps = {\n items: [{text: i18n(Keyset.TitleBreadcrumbs), url: blogPath}],\n theme: 'light',\n };\n\n if (tags?.length) {\n const localizedTags = getTags(tags, blogPath);\n const tag = localizedTags[0];\n // @ts-ignore todo fix\n breadcrumbs.items.push({text: tag.name, url: tag.url});\n }\n\n return breadcrumbs;\n}\n\nconst getArrayOfEvents = (events?: AnalyticsEventsProp) => {\n if (!events) {\n return [];\n }\n\n if (Array.isArray(events)) {\n return events;\n }\n\n return [events];\n};\n\nexport const getMergedAnalyticsEvents = (\n analyticEvents: AnalyticsEventsProp,\n existringEvents?: AnalyticsEventsProp,\n) => {\n const eventsAsArray = getArrayOfEvents(analyticEvents);\n const existingAsArray = getArrayOfEvents(existringEvents);\n\n return eventsAsArray.concat(existingAsArray);\n};\n\nexport const getFeedQueryParams = (\n queryString: Query,\n pageNumber?: number,\n filters?: FilterConfig[],\n): GetPostsRequest => {\n const queryParams = getPageSearchParams(queryString);\n const page = pageNumber || Number(queryParams.get('page') || DEFAULT_PAGE);\n const perPage = Number(queryParams.get('perPage') || DEFAULT_ROWS_PER_PAGE);\n const savedOnly = queryParams.get('savedOnly') === 'true';\n const search = queryParams.get('search') || undefined;\n\n const filterParams: Record<string, string | undefined> = {};\n\n if (filters?.length) {\n filters.forEach(({queryParamName}) => {\n filterParams[queryParamName] = queryParams.get(queryParamName) || undefined;\n });\n }\n\n return {page, perPage, savedOnly, search, ...filterParams};\n};\n\nexport const scrollOnPageChange = (containerId: string) => {\n const cardsContainerEl = document.getElementById(containerId);\n const y = cardsContainerEl?.getBoundingClientRect()?.y || 0;\n\n if (y < 0) {\n scrollToHash(containerId);\n }\n};\n\nexport const getQaAttributes = (qa?: string, ...customKeys: (string | Array<string>)[]) => {\n const attributes: Record<string, string> = {};\n\n if (qa) {\n const keys = QA_ATTRIBUTES_KEYS.concat(flatten(customKeys));\n\n keys.forEach((key) => {\n attributes[camelCase(key)] = `${qa}-${key}`;\n });\n\n attributes.default = qa;\n }\n\n return attributes;\n};\n\ntype PrepareAnalyticsEventArgs = {\n name: string;\n counter?: AnalyticsCounter;\n options?: Record<string, string | number>;\n};\n\nexport const prepareAnalyticsEvent = ({\n name,\n counter = AnalyticsCounter.Main,\n options = {},\n}: PrepareAnalyticsEventArgs): AnalyticsEvent => ({\n ...options,\n name,\n counters: {\n include: [counter],\n },\n});\n"]}
@@ -1,7 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import * as React from 'react';
3
3
  import { useAnalytics } from '@gravity-ui/page-constructor';
4
- import { Icon } from '@gravity-ui/uikit';
5
4
  import { FeedHeader } from "../../components/FeedHeader/FeedHeader.js";
6
5
  import { Posts } from "../../components/Posts/Posts.js";
7
6
  import { PostsError } from "../../components/PostsError/PostsError.js";
@@ -18,7 +17,7 @@ const PAGE_QUERY = 'page';
18
17
  const FIRST_PAGE = 1;
19
18
  export const Feed = ({ image, title }) => {
20
19
  var _a;
21
- const { posts, totalCount, tags, services, pinnedPost, getPosts, pageCountForShowSupportButtons, } = React.useContext(FeedContext);
20
+ const { posts, totalCount, filters, pinnedPost, getPosts, pageCountForShowSupportButtons } = React.useContext(FeedContext);
22
21
  const router = React.useContext(RouterContext);
23
22
  const handleAnalytics = useAnalytics(DefaultEventNames.ShowMore);
24
23
  const additionalAnalyticsEvent = prepareAnalyticsEvent({
@@ -58,14 +57,14 @@ export const Feed = ({ image, title }) => {
58
57
  }, [router]);
59
58
  const fetchData = React.useCallback(async ({ page, query }) => {
60
59
  if (query && getPosts) {
61
- const queryParamsForRequest = getFeedQueryParams(Object.assign(Object.assign({}, queryParams), query), page);
60
+ const queryParamsForRequest = getFeedQueryParams(Object.assign(Object.assign({}, queryParams), query), page, filters);
62
61
  const data = await getPosts(queryParamsForRequest);
63
62
  return data;
64
63
  }
65
64
  else {
66
65
  throw new Error('cant get request');
67
66
  }
68
- }, [getPosts, queryParams]);
67
+ }, [getPosts, queryParams, filters]);
69
68
  const handleLoad = React.useCallback(async ({ page, query }) => {
70
69
  const pageNumber = Number(page || queryParams.page || DEFAULT_PAGE);
71
70
  handleChangeQueryParams(query);
@@ -139,16 +138,7 @@ export const Feed = ({ image, title }) => {
139
138
  payload: loadedPostsCount < postCountOnPage,
140
139
  });
141
140
  }, [currentPage, lastLoadedCount, perPageInQuery, postCountOnPage]);
142
- const serviceItems = React.useMemo(() => services === null || services === void 0 ? void 0 : services.map((service) => ({
143
- content: service.name,
144
- value: `${service.id}`,
145
- })), [services]);
146
- const tagItems = React.useMemo(() => tags === null || tags === void 0 ? void 0 : tags.map((tag) => ({
147
- content: tag.name,
148
- value: tag.slug,
149
- icon: tag.icon && _jsx(Icon, { data: tag.icon }),
150
- })), [tags]);
151
- return (_jsxs("div", { children: [_jsx(FeedHeader, { verticalOffset: "s", tags: tagItems, services: serviceItems, handleLoadData: handleLoad, queryParams: queryParams, background: {
141
+ return (_jsxs("div", { children: [_jsx(FeedHeader, { verticalOffset: "s", filters: filters, handleLoadData: handleLoad, queryParams: queryParams, background: {
152
142
  fullWidth: true,
153
143
  url: image,
154
144
  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"]}
@@ -4,5 +4,5 @@ import './FeedHeader.css';
4
4
  type HeaderProps = Pick<HeaderBlockProps, 'background' | 'offset' | 'theme' | 'verticalOffset'>;
5
5
  type FeedHeaderProps = HeaderProps & ControlsProps;
6
6
  type FeedHeaderContainerProps = FeedHeaderProps & ClassNameProps;
7
- export declare const FeedHeader: ({ tags, services, handleLoadData, offset, background, theme, verticalOffset, className, queryParams, title, }: FeedHeaderContainerProps) => import("react/jsx-runtime").JSX.Element;
7
+ export declare const FeedHeader: ({ filters, handleLoadData, offset, background, theme, verticalOffset, className, queryParams, title, }: FeedHeaderContainerProps) => import("react/jsx-runtime").JSX.Element;
8
8
  export {};
@@ -4,12 +4,12 @@ import { block } from "../../utils/cn.js";
4
4
  import { Controls } from "./components/Controls/Controls.js";
5
5
  import './FeedHeader.css';
6
6
  const b = block('feed-header');
7
- export const FeedHeader = ({ tags, services, handleLoadData, offset = 'default', background, theme = 'light', verticalOffset = 'l', className, queryParams, title, }) => {
7
+ export const FeedHeader = ({ filters, handleLoadData, offset = 'default', background, theme = 'light', verticalOffset = 'l', className, queryParams, title, }) => {
8
8
  const backgroundThemed = background && getThemedValue(background, theme);
9
9
  return (_jsxs("header", { className: b('header', { ['has-background']: Boolean(background) }, className), children: [(backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color) ? (_jsx(FullWidthBackground, { style: { backgroundColor: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color }, theme: "rounded" })) : null, _jsxs(Grid, { className: b('content', { offset, theme, 'vertical-offset': verticalOffset }), children: [backgroundThemed ? (_jsx(BackgroundImage, { src: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.url, className: b('background'), imageClassName: b('background-img'), style: {
10
10
  backgroundColor: backgroundThemed.fullWidth
11
11
  ? ''
12
12
  : backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color,
13
- }, disableCompress: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.disableCompress })) : null, _jsx(Controls, { title: title, tags: tags, services: services, handleLoadData: handleLoadData, queryParams: queryParams })] })] }));
13
+ }, disableCompress: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.disableCompress })) : null, _jsx(Controls, { title: title, filters: filters, handleLoadData: handleLoadData, queryParams: queryParams })] })] }));
14
14
  };
15
15
  //# sourceMappingURL=FeedHeader.js.map