@gravity-ui/blog-constructor 10.1.1-alpha.2 → 10.1.1-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/components/FeedHeader/components/FilterControl/FilterControl.js +20 -20
- package/build/cjs/components/FeedHeader/components/FilterControl/FilterControl.js.map +1 -1
- package/build/cjs/models/common.d.ts +1 -9
- package/build/cjs/models/common.js.map +1 -1
- package/build/esm/components/FeedHeader/components/FilterControl/FilterControl.js +20 -20
- package/build/esm/components/FeedHeader/components/FilterControl/FilterControl.js.map +1 -1
- package/build/esm/models/common.d.ts +1 -9
- package/build/esm/models/common.js.map +1 -1
- package/package.json +1 -1
- package/server/models/common.d.ts +1 -9
|
@@ -11,42 +11,42 @@ const SavedOnlyFilter_1 = require("../SavedOnlyFilter/SavedOnlyFilter.js");
|
|
|
11
11
|
const SearchFilter_1 = require("../SearchFilter/SearchFilter.js");
|
|
12
12
|
const SelectFilter_1 = require("../SelectFilter/SelectFilter.js");
|
|
13
13
|
const b = (0, cn_1.block)('filter-control');
|
|
14
|
+
const addAnalyticsEventPostfix = (analyticsEvents, postfix) => {
|
|
15
|
+
const addPostfix = (event) => (Object.assign(Object.assign({}, event), { name: `${event.name}_${postfix}` }));
|
|
16
|
+
return Array.isArray(analyticsEvents)
|
|
17
|
+
? analyticsEvents.map(addPostfix)
|
|
18
|
+
: addPostfix(analyticsEvents);
|
|
19
|
+
};
|
|
14
20
|
const FilterControl = ({ filter, initialValue, onChange }) => {
|
|
15
21
|
const handleAnalytics = (0, page_constructor_1.useAnalytics)();
|
|
16
22
|
const { hasLikes } = React.useContext(LikesContext_1.LikesContext);
|
|
17
|
-
const
|
|
23
|
+
const handleFilterAnalytics = React.useCallback((postfix, params) => {
|
|
18
24
|
if (filter.analyticsEvents) {
|
|
19
|
-
handleAnalytics(filter.analyticsEvents);
|
|
25
|
+
handleAnalytics(addAnalyticsEventPostfix(filter.analyticsEvents, postfix), params);
|
|
20
26
|
}
|
|
21
|
-
|
|
22
|
-
|
|
27
|
+
}, [filter.analyticsEvents, handleAnalytics]);
|
|
28
|
+
const handleChange = React.useCallback((query) => onChange(query), [onChange]);
|
|
23
29
|
if (filter.type === 'search') {
|
|
24
|
-
const { queryParamName, placeholder
|
|
25
|
-
return ((0, jsx_runtime_1.jsx)("div", { className: b(), children: (0, jsx_runtime_1.jsx)(SearchFilter_1.SearchFilter, { placeholder: placeholder, initialValue: initialValue, onChange: (value) => handleChange({ [queryParamName]: value }), onClick:
|
|
26
|
-
? () => handleAnalytics(clickAnalyticsEvents)
|
|
27
|
-
: undefined }) }));
|
|
30
|
+
const { queryParamName, placeholder } = filter;
|
|
31
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: b(), children: (0, jsx_runtime_1.jsx)(SearchFilter_1.SearchFilter, { placeholder: placeholder, initialValue: initialValue, onChange: (value) => handleChange({ [queryParamName]: value }), onClick: () => handleFilterAnalytics('CLICK') }) }));
|
|
28
32
|
}
|
|
29
33
|
if (filter.type === 'savedOnly') {
|
|
30
|
-
const { queryParamName
|
|
34
|
+
const { queryParamName } = filter;
|
|
31
35
|
if (!hasLikes) {
|
|
32
36
|
return null;
|
|
33
37
|
}
|
|
34
38
|
const handleSavedOnlyChange = (value) => {
|
|
35
|
-
|
|
36
|
-
handleAnalytics(clickAnalyticsEvents, { state: value ? 'on' : 'off' });
|
|
37
|
-
}
|
|
39
|
+
handleFilterAnalytics('CLICK', { state: value ? 'on' : 'off' });
|
|
38
40
|
handleChange({ [queryParamName]: value ? 'true' : '', search: '' });
|
|
39
41
|
};
|
|
40
42
|
return ((0, jsx_runtime_1.jsx)("div", { className: b({ 'width-auto': true }), children: (0, jsx_runtime_1.jsx)(SavedOnlyFilter_1.SavedOnlyFilter, { initialValue: initialValue === 'true', onChange: handleSavedOnlyChange }) }));
|
|
41
43
|
}
|
|
42
|
-
const { queryParamName, multiple, filterable, hasClear, placeholder, options, allLabel, qa
|
|
43
|
-
return ((0, jsx_runtime_1.jsx)("div", { className: b(), children: (0, jsx_runtime_1.jsx)(SelectFilter_1.SelectFilter, { multiple: multiple, filterable: filterable, hasClear: hasClear, placeholder: placeholder, options: options, allLabel: allLabel, qa: qa, initialValue: initialValue, onChange: (value) => handleChange({ [queryParamName]: value }), onOpen:
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
})
|
|
49
|
-
: undefined }) }));
|
|
44
|
+
const { queryParamName, multiple, filterable, hasClear, placeholder, options, allLabel, qa } = filter;
|
|
45
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: b(), children: (0, jsx_runtime_1.jsx)(SelectFilter_1.SelectFilter, { multiple: multiple, filterable: filterable, hasClear: hasClear, placeholder: placeholder, options: options, allLabel: allLabel, qa: qa, initialValue: initialValue, onChange: (value) => handleChange({ [queryParamName]: value }), onOpen: () => handleFilterAnalytics('CLICK'), onClose: ({ selectedValues, changesCount }) => handleFilterAnalytics('CLOSE', {
|
|
46
|
+
selected_values: selectedValues.length ? selectedValues : null,
|
|
47
|
+
changes_count: changesCount,
|
|
48
|
+
count_filters: selectedValues.length,
|
|
49
|
+
}) }) }));
|
|
50
50
|
};
|
|
51
51
|
exports.FilterControl = FilterControl;
|
|
52
52
|
//# sourceMappingURL=FilterControl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterControl.js","sourceRoot":"../../../../../../src","sources":["components/FeedHeader/components/FilterControl/FilterControl.tsx"],"names":[],"mappings":";;;;;AAAA,qDAA+B;
|
|
1
|
+
{"version":3,"file":"FilterControl.js","sourceRoot":"../../../../../../src","sources":["components/FeedHeader/components/FilterControl/FilterControl.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport type {AnalyticsEvent, AnalyticsEventsProp} from '@gravity-ui/page-constructor';\nimport {useAnalytics} from '@gravity-ui/page-constructor';\n\nimport {LikesContext} from '../../../../contexts/LikesContext';\nimport {\n FilterConfig,\n Query,\n SavedOnlyFilterConfig,\n SearchFilterConfig,\n SelectFilterConfig,\n} from '../../../../models/common';\nimport {block} from '../../../../utils/cn';\nimport {SavedOnlyFilter} from '../SavedOnlyFilter/SavedOnlyFilter';\nimport {SearchFilter} from '../SearchFilter/SearchFilter';\nimport {SelectFilter} from '../SelectFilter/SelectFilter';\n\nimport './FilterControl.scss';\n\nconst b = block('filter-control');\n\nconst addAnalyticsEventPostfix = (\n analyticsEvents: AnalyticsEventsProp,\n postfix: string,\n): AnalyticsEventsProp => {\n const addPostfix = (event: AnalyticsEvent): AnalyticsEvent => ({\n ...event,\n name: `${event.name}_${postfix}`,\n });\n\n return Array.isArray(analyticsEvents)\n ? analyticsEvents.map(addPostfix)\n : addPostfix(analyticsEvents);\n};\n\nexport type FilterControlProps = {\n filter: FilterConfig;\n initialValue: string | number | null | undefined;\n onChange: (query: Query) => void;\n};\n\nexport const FilterControl = ({filter, initialValue, onChange}: FilterControlProps) => {\n const handleAnalytics = useAnalytics();\n const {hasLikes} = React.useContext(LikesContext);\n\n const handleFilterAnalytics = React.useCallback(\n (postfix: string, params?: Record<string, unknown>) => {\n if (filter.analyticsEvents) {\n handleAnalytics(\n addAnalyticsEventPostfix(filter.analyticsEvents, postfix),\n params as Record<string, string>,\n );\n }\n },\n [filter.analyticsEvents, handleAnalytics],\n );\n\n const handleChange = React.useCallback((query: Query) => onChange(query), [onChange]);\n\n if (filter.type === 'search') {\n const {queryParamName, placeholder} = filter as SearchFilterConfig;\n\n return (\n <div className={b()}>\n <SearchFilter\n placeholder={placeholder}\n initialValue={initialValue as string | undefined}\n onChange={(value) => handleChange({[queryParamName]: value} as Query)}\n onClick={() => handleFilterAnalytics('CLICK')}\n />\n </div>\n );\n }\n\n if (filter.type === 'savedOnly') {\n const {queryParamName} = filter as SavedOnlyFilterConfig;\n\n if (!hasLikes) {\n return null;\n }\n\n const handleSavedOnlyChange = (value: boolean) => {\n handleFilterAnalytics('CLICK', {state: value ? 'on' : 'off'});\n handleChange({[queryParamName]: value ? 'true' : '', search: ''} as Query);\n };\n\n return (\n <div className={b({'width-auto': true})}>\n <SavedOnlyFilter\n initialValue={initialValue === 'true'}\n onChange={handleSavedOnlyChange}\n />\n </div>\n );\n }\n\n const {queryParamName, multiple, filterable, hasClear, placeholder, options, allLabel, qa} =\n filter as SelectFilterConfig;\n\n return (\n <div className={b()}>\n <SelectFilter\n multiple={multiple}\n filterable={filterable}\n hasClear={hasClear}\n placeholder={placeholder as string | undefined}\n options={options}\n allLabel={allLabel}\n qa={qa}\n initialValue={initialValue}\n onChange={(value) => handleChange({[queryParamName]: value} as Query)}\n onOpen={() => handleFilterAnalytics('CLICK')}\n onClose={({selectedValues, changesCount}) =>\n handleFilterAnalytics('CLOSE', {\n selected_values: selectedValues.length ? selectedValues : null,\n changes_count: changesCount,\n count_filters: selectedValues.length,\n })\n }\n />\n </div>\n );\n};\n"]}
|
|
@@ -166,7 +166,7 @@ export interface QAProps {
|
|
|
166
166
|
type FilterConfigBase = {
|
|
167
167
|
/** The key used in queryParams and passed to handleLoadData query */
|
|
168
168
|
queryParamName: string;
|
|
169
|
-
/** Optional analytics events
|
|
169
|
+
/** Optional base analytics events for filter interactions */
|
|
170
170
|
analyticsEvents?: AnalyticsEventsProp;
|
|
171
171
|
};
|
|
172
172
|
export type SelectFilterCloseData = {
|
|
@@ -181,22 +181,14 @@ export type SelectFilterConfig = FilterConfigBase & Pick<SelectProps, 'multiple'
|
|
|
181
181
|
allLabel: string;
|
|
182
182
|
/** Optional QA attribute forwarded to the switcher */
|
|
183
183
|
qa?: string;
|
|
184
|
-
/** Optional analytics events fired when the select opens */
|
|
185
|
-
openAnalyticsEvents?: AnalyticsEventsProp;
|
|
186
|
-
/** Optional analytics events fired when the select closes */
|
|
187
|
-
closeAnalyticsEvents?: AnalyticsEventsProp;
|
|
188
184
|
};
|
|
189
185
|
export type SearchFilterConfig = FilterConfigBase & {
|
|
190
186
|
type: 'search';
|
|
191
187
|
/** Placeholder text for the search input */
|
|
192
188
|
placeholder?: string;
|
|
193
|
-
/** Optional analytics events fired when the search input is clicked */
|
|
194
|
-
clickAnalyticsEvents?: AnalyticsEventsProp;
|
|
195
189
|
};
|
|
196
190
|
export type SavedOnlyFilterConfig = FilterConfigBase & {
|
|
197
191
|
type: 'savedOnly';
|
|
198
|
-
/** Optional analytics events fired with the next saved-only state */
|
|
199
|
-
clickAnalyticsEvents?: AnalyticsEventsProp;
|
|
200
192
|
};
|
|
201
193
|
export type FilterConfig = SelectFilterConfig | SearchFilterConfig | SavedOnlyFilterConfig;
|
|
202
194
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"../../../src","sources":["models/common.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"../../../src","sources":["models/common.ts"],"names":[],"mappings":";;;AAqPA,wDAWC;AAnPD,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;AA0DD,SAAgB,sBAAsB,CAAC,OAAsB;IACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,2EAA2E;IAC3E,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5B,OAAO,OAA2B,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,OAAyB,CAAC,CAAC;AACvC,CAAC;AAED,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 {SelectOption, SelectProps} from '@gravity-ui/uikit';\nimport {IBrowser, IDevice} from 'ua-parser-js';\n\nimport {Locale} from '../models/locale';\n\nexport enum Theme {\n Light = 'light',\n Dark = 'dark',\n}\n\nexport interface ClassNameProps {\n className?: string;\n}\n\nexport type Author = {\n id: number | string;\n avatar: string | null;\n createdAt: string;\n updatedAt: string;\n firstName: string | null;\n secondName: string | null;\n description: string | null;\n fullDescription: string | null;\n shortDescription: string | null;\n} & {\n [x: string]: string | null;\n};\n\nexport type Query = Record<string, number | string | null>;\n\n//page models\n\nexport interface Menu {\n title: string;\n}\n\nexport interface WithDeviceProps {\n device: IDevice;\n browser: IBrowser;\n isRobot: boolean;\n}\n\nexport interface PostsProps {\n posts: PostData[];\n count: number;\n totalCount: number;\n pinnedPost?: PostData;\n}\n\nexport type Tag = {\n slug: string;\n name: string;\n createdAt?: string;\n updatedAt?: string;\n icon?: string;\n isDeleted?: boolean;\n locale?: string;\n blogTagId?: number | string;\n count?: number;\n};\n\nexport interface PostData {\n author?: string;\n authors?: Author[];\n blogPostId?: number | string;\n content?: string;\n date: string;\n description?: string;\n hasUserLike: boolean;\n htmlTitle: string;\n id: number;\n image: string;\n isPublished?: boolean;\n sharedImage?: string;\n likes: number;\n locale: Locale;\n metaDescription?: string | null;\n metaTitle?: string | null;\n readingTime?: number;\n shareDescription?: string;\n shareImage?: string;\n shareTitle?: string;\n slug: string;\n keywords?: string[];\n tags: Tag[];\n textTitle: string;\n title: string;\n url: string;\n noIndex?: boolean;\n}\n\nexport enum BlockType {\n Header = 'blog-header-block',\n YFM = 'blog-yfm-block',\n Layout = 'blog-layout-block',\n Media = 'blog-media-block',\n Banner = 'blog-banner-block',\n CTA = 'blog-cta-block',\n ColoredText = 'blog-colored-text-block',\n Author = 'blog-author-block',\n Suggest = 'blog-suggest-block',\n Meta = 'blog-meta-block',\n Feed = 'blog-feed-block',\n Form = 'blog-form-block',\n CompactMedia = 'blog-compact-media-block',\n Take = 'blog-take-block',\n SideCardList = 'blog-side-card-list-block',\n}\n\nexport type MetaProps = {\n metaComponent: JSX.Element;\n needHelmetWrapper: boolean;\n};\n\nexport type MetaOrganizationType = {\n url: string;\n appTitle: string;\n legalName: string;\n supportEmail: string;\n};\n\nexport interface PostMetaProps {\n title: string;\n date: string;\n image: string;\n canonicalUrl: string;\n content?: string;\n description?: string;\n sharing: {\n shareTitle: string;\n shareDescription: string;\n shareImage: string;\n shareGenImage: string;\n shareGenTitle: string;\n };\n keywords?: string[];\n noIndex?: boolean;\n authors?: Author[];\n tags?: Tag[];\n organization: MetaOrganizationType;\n}\n\nexport type ToggleLikeCallbackType = ({\n postId,\n hasLike,\n}: {\n postId?: number | string;\n hasLike?: boolean;\n}) => void;\n\nexport interface HeaderBlockProps extends PageConstructorHeaderBlockProps {\n backLink?: {\n url: string;\n title: React.ReactNode;\n };\n}\n\nexport type GetPostsRequest = {\n page: number;\n perPage: number;\n savedOnly: boolean;\n search: string | undefined;\n [filterParam: string]: string | number | boolean | undefined;\n};\n\nexport type GetPostsType = (query: GetPostsRequest) => Promise<PostsProps>;\n\nexport type HandleChangeQueryParams = (params: Query) => void;\n\nexport enum DefaultEventNames {\n ShareButton = 'share-button-click',\n SaveButton = 'save-button-click',\n ShowMore = 'show-more-button-click',\n PaginatorHome = 'paginator-home-button-click',\n PaginatorNext = 'paginator-next-button-click',\n PaginatorPage = 'paginator-page-button-click',\n Tag = 'selector-tag-click',\n Service = 'selector-service-click',\n SaveOnly = 'save-only-button-click',\n}\n\nexport type FetchArgs = {\n page?: number;\n query: Query;\n};\n\nexport interface QAProps {\n qa?: string;\n}\n\ntype FilterConfigBase = {\n /** The key used in queryParams and passed to handleLoadData query */\n queryParamName: string;\n /** Optional base analytics events for filter interactions */\n analyticsEvents?: AnalyticsEventsProp;\n};\n\nexport type SelectFilterCloseData = {\n selectedValues: string[];\n changesCount: number;\n};\n\nexport type SelectFilterConfig = FilterConfigBase &\n Pick<SelectProps, 'multiple' | 'filterable' | 'hasClear' | 'placeholder'> & {\n type?: 'select';\n /** The selectable items for this filter */\n options: SelectOption[];\n /** Label shown when nothing is selected (acts as \"All ...\" placeholder) */\n allLabel: string;\n /** Optional QA attribute forwarded to the switcher */\n qa?: string;\n };\n\nexport type SearchFilterConfig = FilterConfigBase & {\n type: 'search';\n /** Placeholder text for the search input */\n placeholder?: string;\n};\n\nexport type SavedOnlyFilterConfig = FilterConfigBase & {\n type: 'savedOnly';\n};\n\nexport type FilterConfig = SelectFilterConfig | SearchFilterConfig | SavedOnlyFilterConfig;\n\n/**\n * Filters can be supplied either as a flat array (all filters in one row)\n * or as an array of rows (each inner array is rendered as a separate row).\n *\n * @example Single row (backward-compatible)\n * filters: [searchFilter, tagsFilter]\n *\n * @example Multiple rows\n * filters: [[searchFilter, savedOnlyFilter], [tagsFilter, serviceFilter]]\n */\nexport type FiltersConfig = FilterConfig[] | FilterConfig[][];\n\nexport function normalizeFiltersToRows(filters: FiltersConfig): FilterConfig[][] {\n if (filters.length === 0) {\n return [];\n }\n\n // If the first element is itself an array, the input is already multi-row.\n if (Array.isArray(filters[0])) {\n return filters as FilterConfig[][];\n }\n\n return [filters as FilterConfig[]];\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"]}
|
|
@@ -8,41 +8,41 @@ import { SearchFilter } from "../SearchFilter/SearchFilter.js";
|
|
|
8
8
|
import { SelectFilter } from "../SelectFilter/SelectFilter.js";
|
|
9
9
|
import './FilterControl.css';
|
|
10
10
|
const b = block('filter-control');
|
|
11
|
+
const addAnalyticsEventPostfix = (analyticsEvents, postfix) => {
|
|
12
|
+
const addPostfix = (event) => (Object.assign(Object.assign({}, event), { name: `${event.name}_${postfix}` }));
|
|
13
|
+
return Array.isArray(analyticsEvents)
|
|
14
|
+
? analyticsEvents.map(addPostfix)
|
|
15
|
+
: addPostfix(analyticsEvents);
|
|
16
|
+
};
|
|
11
17
|
export const FilterControl = ({ filter, initialValue, onChange }) => {
|
|
12
18
|
const handleAnalytics = useAnalytics();
|
|
13
19
|
const { hasLikes } = React.useContext(LikesContext);
|
|
14
|
-
const
|
|
20
|
+
const handleFilterAnalytics = React.useCallback((postfix, params) => {
|
|
15
21
|
if (filter.analyticsEvents) {
|
|
16
|
-
handleAnalytics(filter.analyticsEvents);
|
|
22
|
+
handleAnalytics(addAnalyticsEventPostfix(filter.analyticsEvents, postfix), params);
|
|
17
23
|
}
|
|
18
|
-
|
|
19
|
-
|
|
24
|
+
}, [filter.analyticsEvents, handleAnalytics]);
|
|
25
|
+
const handleChange = React.useCallback((query) => onChange(query), [onChange]);
|
|
20
26
|
if (filter.type === 'search') {
|
|
21
|
-
const { queryParamName, placeholder
|
|
22
|
-
return (_jsx("div", { className: b(), children: _jsx(SearchFilter, { placeholder: placeholder, initialValue: initialValue, onChange: (value) => handleChange({ [queryParamName]: value }), onClick:
|
|
23
|
-
? () => handleAnalytics(clickAnalyticsEvents)
|
|
24
|
-
: undefined }) }));
|
|
27
|
+
const { queryParamName, placeholder } = filter;
|
|
28
|
+
return (_jsx("div", { className: b(), children: _jsx(SearchFilter, { placeholder: placeholder, initialValue: initialValue, onChange: (value) => handleChange({ [queryParamName]: value }), onClick: () => handleFilterAnalytics('CLICK') }) }));
|
|
25
29
|
}
|
|
26
30
|
if (filter.type === 'savedOnly') {
|
|
27
|
-
const { queryParamName
|
|
31
|
+
const { queryParamName } = filter;
|
|
28
32
|
if (!hasLikes) {
|
|
29
33
|
return null;
|
|
30
34
|
}
|
|
31
35
|
const handleSavedOnlyChange = (value) => {
|
|
32
|
-
|
|
33
|
-
handleAnalytics(clickAnalyticsEvents, { state: value ? 'on' : 'off' });
|
|
34
|
-
}
|
|
36
|
+
handleFilterAnalytics('CLICK', { state: value ? 'on' : 'off' });
|
|
35
37
|
handleChange({ [queryParamName]: value ? 'true' : '', search: '' });
|
|
36
38
|
};
|
|
37
39
|
return (_jsx("div", { className: b({ 'width-auto': true }), children: _jsx(SavedOnlyFilter, { initialValue: initialValue === 'true', onChange: handleSavedOnlyChange }) }));
|
|
38
40
|
}
|
|
39
|
-
const { queryParamName, multiple, filterable, hasClear, placeholder, options, allLabel, qa
|
|
40
|
-
return (_jsx("div", { className: b(), children: _jsx(SelectFilter, { multiple: multiple, filterable: filterable, hasClear: hasClear, placeholder: placeholder, options: options, allLabel: allLabel, qa: qa, initialValue: initialValue, onChange: (value) => handleChange({ [queryParamName]: value }), onOpen:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
})
|
|
46
|
-
: undefined }) }));
|
|
41
|
+
const { queryParamName, multiple, filterable, hasClear, placeholder, options, allLabel, qa } = filter;
|
|
42
|
+
return (_jsx("div", { className: b(), children: _jsx(SelectFilter, { multiple: multiple, filterable: filterable, hasClear: hasClear, placeholder: placeholder, options: options, allLabel: allLabel, qa: qa, initialValue: initialValue, onChange: (value) => handleChange({ [queryParamName]: value }), onOpen: () => handleFilterAnalytics('CLICK'), onClose: ({ selectedValues, changesCount }) => handleFilterAnalytics('CLOSE', {
|
|
43
|
+
selected_values: selectedValues.length ? selectedValues : null,
|
|
44
|
+
changes_count: changesCount,
|
|
45
|
+
count_filters: selectedValues.length,
|
|
46
|
+
}) }) }));
|
|
47
47
|
};
|
|
48
48
|
//# sourceMappingURL=FilterControl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterControl.js","sourceRoot":"../../../../../../src","sources":["components/FeedHeader/components/FilterControl/FilterControl.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"FilterControl.js","sourceRoot":"../../../../../../src","sources":["components/FeedHeader/components/FilterControl/FilterControl.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport type {AnalyticsEvent, AnalyticsEventsProp} from '@gravity-ui/page-constructor';\nimport {useAnalytics} from '@gravity-ui/page-constructor';\n\nimport {LikesContext} from '../../../../contexts/LikesContext';\nimport {\n FilterConfig,\n Query,\n SavedOnlyFilterConfig,\n SearchFilterConfig,\n SelectFilterConfig,\n} from '../../../../models/common';\nimport {block} from '../../../../utils/cn';\nimport {SavedOnlyFilter} from '../SavedOnlyFilter/SavedOnlyFilter';\nimport {SearchFilter} from '../SearchFilter/SearchFilter';\nimport {SelectFilter} from '../SelectFilter/SelectFilter';\n\nimport './FilterControl.scss';\n\nconst b = block('filter-control');\n\nconst addAnalyticsEventPostfix = (\n analyticsEvents: AnalyticsEventsProp,\n postfix: string,\n): AnalyticsEventsProp => {\n const addPostfix = (event: AnalyticsEvent): AnalyticsEvent => ({\n ...event,\n name: `${event.name}_${postfix}`,\n });\n\n return Array.isArray(analyticsEvents)\n ? analyticsEvents.map(addPostfix)\n : addPostfix(analyticsEvents);\n};\n\nexport type FilterControlProps = {\n filter: FilterConfig;\n initialValue: string | number | null | undefined;\n onChange: (query: Query) => void;\n};\n\nexport const FilterControl = ({filter, initialValue, onChange}: FilterControlProps) => {\n const handleAnalytics = useAnalytics();\n const {hasLikes} = React.useContext(LikesContext);\n\n const handleFilterAnalytics = React.useCallback(\n (postfix: string, params?: Record<string, unknown>) => {\n if (filter.analyticsEvents) {\n handleAnalytics(\n addAnalyticsEventPostfix(filter.analyticsEvents, postfix),\n params as Record<string, string>,\n );\n }\n },\n [filter.analyticsEvents, handleAnalytics],\n );\n\n const handleChange = React.useCallback((query: Query) => onChange(query), [onChange]);\n\n if (filter.type === 'search') {\n const {queryParamName, placeholder} = filter as SearchFilterConfig;\n\n return (\n <div className={b()}>\n <SearchFilter\n placeholder={placeholder}\n initialValue={initialValue as string | undefined}\n onChange={(value) => handleChange({[queryParamName]: value} as Query)}\n onClick={() => handleFilterAnalytics('CLICK')}\n />\n </div>\n );\n }\n\n if (filter.type === 'savedOnly') {\n const {queryParamName} = filter as SavedOnlyFilterConfig;\n\n if (!hasLikes) {\n return null;\n }\n\n const handleSavedOnlyChange = (value: boolean) => {\n handleFilterAnalytics('CLICK', {state: value ? 'on' : 'off'});\n handleChange({[queryParamName]: value ? 'true' : '', search: ''} as Query);\n };\n\n return (\n <div className={b({'width-auto': true})}>\n <SavedOnlyFilter\n initialValue={initialValue === 'true'}\n onChange={handleSavedOnlyChange}\n />\n </div>\n );\n }\n\n const {queryParamName, multiple, filterable, hasClear, placeholder, options, allLabel, qa} =\n filter as SelectFilterConfig;\n\n return (\n <div className={b()}>\n <SelectFilter\n multiple={multiple}\n filterable={filterable}\n hasClear={hasClear}\n placeholder={placeholder as string | undefined}\n options={options}\n allLabel={allLabel}\n qa={qa}\n initialValue={initialValue}\n onChange={(value) => handleChange({[queryParamName]: value} as Query)}\n onOpen={() => handleFilterAnalytics('CLICK')}\n onClose={({selectedValues, changesCount}) =>\n handleFilterAnalytics('CLOSE', {\n selected_values: selectedValues.length ? selectedValues : null,\n changes_count: changesCount,\n count_filters: selectedValues.length,\n })\n }\n />\n </div>\n );\n};\n"]}
|
|
@@ -166,7 +166,7 @@ export interface QAProps {
|
|
|
166
166
|
type FilterConfigBase = {
|
|
167
167
|
/** The key used in queryParams and passed to handleLoadData query */
|
|
168
168
|
queryParamName: string;
|
|
169
|
-
/** Optional analytics events
|
|
169
|
+
/** Optional base analytics events for filter interactions */
|
|
170
170
|
analyticsEvents?: AnalyticsEventsProp;
|
|
171
171
|
};
|
|
172
172
|
export type SelectFilterCloseData = {
|
|
@@ -181,22 +181,14 @@ export type SelectFilterConfig = FilterConfigBase & Pick<SelectProps, 'multiple'
|
|
|
181
181
|
allLabel: string;
|
|
182
182
|
/** Optional QA attribute forwarded to the switcher */
|
|
183
183
|
qa?: string;
|
|
184
|
-
/** Optional analytics events fired when the select opens */
|
|
185
|
-
openAnalyticsEvents?: AnalyticsEventsProp;
|
|
186
|
-
/** Optional analytics events fired when the select closes */
|
|
187
|
-
closeAnalyticsEvents?: AnalyticsEventsProp;
|
|
188
184
|
};
|
|
189
185
|
export type SearchFilterConfig = FilterConfigBase & {
|
|
190
186
|
type: 'search';
|
|
191
187
|
/** Placeholder text for the search input */
|
|
192
188
|
placeholder?: string;
|
|
193
|
-
/** Optional analytics events fired when the search input is clicked */
|
|
194
|
-
clickAnalyticsEvents?: AnalyticsEventsProp;
|
|
195
189
|
};
|
|
196
190
|
export type SavedOnlyFilterConfig = FilterConfigBase & {
|
|
197
191
|
type: 'savedOnly';
|
|
198
|
-
/** Optional analytics events fired with the next saved-only state */
|
|
199
|
-
clickAnalyticsEvents?: AnalyticsEventsProp;
|
|
200
192
|
};
|
|
201
193
|
export type FilterConfig = SelectFilterConfig | SearchFilterConfig | SavedOnlyFilterConfig;
|
|
202
194
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"../../../src","sources":["models/common.ts"],"names":[],"mappings":"AAaA,MAAM,CAAN,IAAY,KAGX;AAHD,WAAY,KAAK;IACb,wBAAe,CAAA;IACf,sBAAa,CAAA;AACjB,CAAC,EAHW,KAAK,KAAL,KAAK,QAGhB;AAmFD,MAAM,CAAN,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,KAAT,SAAS,QAgBpB;AA8DD,MAAM,CAAN,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,KAAjB,iBAAiB,QAU5B;
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"../../../src","sources":["models/common.ts"],"names":[],"mappings":"AAaA,MAAM,CAAN,IAAY,KAGX;AAHD,WAAY,KAAK;IACb,wBAAe,CAAA;IACf,sBAAa,CAAA;AACjB,CAAC,EAHW,KAAK,KAAL,KAAK,QAGhB;AAmFD,MAAM,CAAN,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,KAAT,SAAS,QAgBpB;AA8DD,MAAM,CAAN,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,KAAjB,iBAAiB,QAU5B;AA0DD,MAAM,UAAU,sBAAsB,CAAC,OAAsB;IACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,2EAA2E;IAC3E,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5B,OAAO,OAA2B,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,OAAyB,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACpB,2BAAW,CAAA;IACX,4BAAY,CAAA;AAChB,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;AAED,MAAM,CAAN,IAAY,yBAGX;AAHD,WAAY,yBAAyB;IACjC,sCAAS,CAAA;IACT,sCAAS,CAAA;AACb,CAAC,EAHW,yBAAyB,KAAzB,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 {SelectOption, SelectProps} from '@gravity-ui/uikit';\nimport {IBrowser, IDevice} from 'ua-parser-js';\n\nimport {Locale} from '../models/locale';\n\nexport enum Theme {\n Light = 'light',\n Dark = 'dark',\n}\n\nexport interface ClassNameProps {\n className?: string;\n}\n\nexport type Author = {\n id: number | string;\n avatar: string | null;\n createdAt: string;\n updatedAt: string;\n firstName: string | null;\n secondName: string | null;\n description: string | null;\n fullDescription: string | null;\n shortDescription: string | null;\n} & {\n [x: string]: string | null;\n};\n\nexport type Query = Record<string, number | string | null>;\n\n//page models\n\nexport interface Menu {\n title: string;\n}\n\nexport interface WithDeviceProps {\n device: IDevice;\n browser: IBrowser;\n isRobot: boolean;\n}\n\nexport interface PostsProps {\n posts: PostData[];\n count: number;\n totalCount: number;\n pinnedPost?: PostData;\n}\n\nexport type Tag = {\n slug: string;\n name: string;\n createdAt?: string;\n updatedAt?: string;\n icon?: string;\n isDeleted?: boolean;\n locale?: string;\n blogTagId?: number | string;\n count?: number;\n};\n\nexport interface PostData {\n author?: string;\n authors?: Author[];\n blogPostId?: number | string;\n content?: string;\n date: string;\n description?: string;\n hasUserLike: boolean;\n htmlTitle: string;\n id: number;\n image: string;\n isPublished?: boolean;\n sharedImage?: string;\n likes: number;\n locale: Locale;\n metaDescription?: string | null;\n metaTitle?: string | null;\n readingTime?: number;\n shareDescription?: string;\n shareImage?: string;\n shareTitle?: string;\n slug: string;\n keywords?: string[];\n tags: Tag[];\n textTitle: string;\n title: string;\n url: string;\n noIndex?: boolean;\n}\n\nexport enum BlockType {\n Header = 'blog-header-block',\n YFM = 'blog-yfm-block',\n Layout = 'blog-layout-block',\n Media = 'blog-media-block',\n Banner = 'blog-banner-block',\n CTA = 'blog-cta-block',\n ColoredText = 'blog-colored-text-block',\n Author = 'blog-author-block',\n Suggest = 'blog-suggest-block',\n Meta = 'blog-meta-block',\n Feed = 'blog-feed-block',\n Form = 'blog-form-block',\n CompactMedia = 'blog-compact-media-block',\n Take = 'blog-take-block',\n SideCardList = 'blog-side-card-list-block',\n}\n\nexport type MetaProps = {\n metaComponent: JSX.Element;\n needHelmetWrapper: boolean;\n};\n\nexport type MetaOrganizationType = {\n url: string;\n appTitle: string;\n legalName: string;\n supportEmail: string;\n};\n\nexport interface PostMetaProps {\n title: string;\n date: string;\n image: string;\n canonicalUrl: string;\n content?: string;\n description?: string;\n sharing: {\n shareTitle: string;\n shareDescription: string;\n shareImage: string;\n shareGenImage: string;\n shareGenTitle: string;\n };\n keywords?: string[];\n noIndex?: boolean;\n authors?: Author[];\n tags?: Tag[];\n organization: MetaOrganizationType;\n}\n\nexport type ToggleLikeCallbackType = ({\n postId,\n hasLike,\n}: {\n postId?: number | string;\n hasLike?: boolean;\n}) => void;\n\nexport interface HeaderBlockProps extends PageConstructorHeaderBlockProps {\n backLink?: {\n url: string;\n title: React.ReactNode;\n };\n}\n\nexport type GetPostsRequest = {\n page: number;\n perPage: number;\n savedOnly: boolean;\n search: string | undefined;\n [filterParam: string]: string | number | boolean | undefined;\n};\n\nexport type GetPostsType = (query: GetPostsRequest) => Promise<PostsProps>;\n\nexport type HandleChangeQueryParams = (params: Query) => void;\n\nexport enum DefaultEventNames {\n ShareButton = 'share-button-click',\n SaveButton = 'save-button-click',\n ShowMore = 'show-more-button-click',\n PaginatorHome = 'paginator-home-button-click',\n PaginatorNext = 'paginator-next-button-click',\n PaginatorPage = 'paginator-page-button-click',\n Tag = 'selector-tag-click',\n Service = 'selector-service-click',\n SaveOnly = 'save-only-button-click',\n}\n\nexport type FetchArgs = {\n page?: number;\n query: Query;\n};\n\nexport interface QAProps {\n qa?: string;\n}\n\ntype FilterConfigBase = {\n /** The key used in queryParams and passed to handleLoadData query */\n queryParamName: string;\n /** Optional base analytics events for filter interactions */\n analyticsEvents?: AnalyticsEventsProp;\n};\n\nexport type SelectFilterCloseData = {\n selectedValues: string[];\n changesCount: number;\n};\n\nexport type SelectFilterConfig = FilterConfigBase &\n Pick<SelectProps, 'multiple' | 'filterable' | 'hasClear' | 'placeholder'> & {\n type?: 'select';\n /** The selectable items for this filter */\n options: SelectOption[];\n /** Label shown when nothing is selected (acts as \"All ...\" placeholder) */\n allLabel: string;\n /** Optional QA attribute forwarded to the switcher */\n qa?: string;\n };\n\nexport type SearchFilterConfig = FilterConfigBase & {\n type: 'search';\n /** Placeholder text for the search input */\n placeholder?: string;\n};\n\nexport type SavedOnlyFilterConfig = FilterConfigBase & {\n type: 'savedOnly';\n};\n\nexport type FilterConfig = SelectFilterConfig | SearchFilterConfig | SavedOnlyFilterConfig;\n\n/**\n * Filters can be supplied either as a flat array (all filters in one row)\n * or as an array of rows (each inner array is rendered as a separate row).\n *\n * @example Single row (backward-compatible)\n * filters: [searchFilter, tagsFilter]\n *\n * @example Multiple rows\n * filters: [[searchFilter, savedOnlyFilter], [tagsFilter, serviceFilter]]\n */\nexport type FiltersConfig = FilterConfig[] | FilterConfig[][];\n\nexport function normalizeFiltersToRows(filters: FiltersConfig): FilterConfig[][] {\n if (filters.length === 0) {\n return [];\n }\n\n // If the first element is itself an array, the input is already multi-row.\n if (Array.isArray(filters[0])) {\n return filters as FilterConfig[][];\n }\n\n return [filters as FilterConfig[]];\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"]}
|
package/package.json
CHANGED
|
@@ -166,7 +166,7 @@ export interface QAProps {
|
|
|
166
166
|
type FilterConfigBase = {
|
|
167
167
|
/** The key used in queryParams and passed to handleLoadData query */
|
|
168
168
|
queryParamName: string;
|
|
169
|
-
/** Optional analytics events
|
|
169
|
+
/** Optional base analytics events for filter interactions */
|
|
170
170
|
analyticsEvents?: AnalyticsEventsProp;
|
|
171
171
|
};
|
|
172
172
|
export type SelectFilterCloseData = {
|
|
@@ -181,22 +181,14 @@ export type SelectFilterConfig = FilterConfigBase & Pick<SelectProps, 'multiple'
|
|
|
181
181
|
allLabel: string;
|
|
182
182
|
/** Optional QA attribute forwarded to the switcher */
|
|
183
183
|
qa?: string;
|
|
184
|
-
/** Optional analytics events fired when the select opens */
|
|
185
|
-
openAnalyticsEvents?: AnalyticsEventsProp;
|
|
186
|
-
/** Optional analytics events fired when the select closes */
|
|
187
|
-
closeAnalyticsEvents?: AnalyticsEventsProp;
|
|
188
184
|
};
|
|
189
185
|
export type SearchFilterConfig = FilterConfigBase & {
|
|
190
186
|
type: 'search';
|
|
191
187
|
/** Placeholder text for the search input */
|
|
192
188
|
placeholder?: string;
|
|
193
|
-
/** Optional analytics events fired when the search input is clicked */
|
|
194
|
-
clickAnalyticsEvents?: AnalyticsEventsProp;
|
|
195
189
|
};
|
|
196
190
|
export type SavedOnlyFilterConfig = FilterConfigBase & {
|
|
197
191
|
type: 'savedOnly';
|
|
198
|
-
/** Optional analytics events fired with the next saved-only state */
|
|
199
|
-
clickAnalyticsEvents?: AnalyticsEventsProp;
|
|
200
192
|
};
|
|
201
193
|
export type FilterConfig = SelectFilterConfig | SearchFilterConfig | SavedOnlyFilterConfig;
|
|
202
194
|
/**
|