@gravity-ui/blog-constructor 10.1.1-alpha.1 → 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 -17
- package/build/cjs/components/FeedHeader/components/FilterControl/FilterControl.js.map +1 -1
- package/build/cjs/models/common.d.ts +1 -10
- package/build/cjs/models/common.js.map +1 -1
- package/build/esm/components/FeedHeader/components/FilterControl/FilterControl.js +20 -17
- package/build/esm/components/FeedHeader/components/FilterControl/FilterControl.js.map +1 -1
- package/build/esm/models/common.d.ts +1 -10
- package/build/esm/models/common.js.map +1 -1
- package/package.json +1 -1
- package/server/models/common.d.ts +1 -10
|
@@ -11,39 +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
|
|
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
|
+
};
|
|
15
20
|
const FilterControl = ({ filter, initialValue, onChange }) => {
|
|
16
21
|
const handleAnalytics = (0, page_constructor_1.useAnalytics)();
|
|
17
22
|
const { hasLikes } = React.useContext(LikesContext_1.LikesContext);
|
|
18
|
-
const
|
|
23
|
+
const handleFilterAnalytics = React.useCallback((postfix, params) => {
|
|
19
24
|
if (filter.analyticsEvents) {
|
|
20
|
-
handleAnalytics(filter.analyticsEvents);
|
|
25
|
+
handleAnalytics(addAnalyticsEventPostfix(filter.analyticsEvents, postfix), params);
|
|
21
26
|
}
|
|
22
|
-
|
|
23
|
-
|
|
27
|
+
}, [filter.analyticsEvents, handleAnalytics]);
|
|
28
|
+
const handleChange = React.useCallback((query) => onChange(query), [onChange]);
|
|
24
29
|
if (filter.type === 'search') {
|
|
25
|
-
const { queryParamName, placeholder
|
|
26
|
-
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:
|
|
27
|
-
? () => handleAnalytics(clickAnalyticsEvents)
|
|
28
|
-
: 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') }) }));
|
|
29
32
|
}
|
|
30
33
|
if (filter.type === 'savedOnly') {
|
|
31
|
-
const { queryParamName
|
|
34
|
+
const { queryParamName } = filter;
|
|
32
35
|
if (!hasLikes) {
|
|
33
36
|
return null;
|
|
34
37
|
}
|
|
35
38
|
const handleSavedOnlyChange = (value) => {
|
|
36
|
-
|
|
37
|
-
handleAnalytics(resolveAnalyticsEvents(clickAnalyticsEvents, value));
|
|
38
|
-
}
|
|
39
|
+
handleFilterAnalytics('CLICK', { state: value ? 'on' : 'off' });
|
|
39
40
|
handleChange({ [queryParamName]: value ? 'true' : '', search: '' });
|
|
40
41
|
};
|
|
41
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 }) }));
|
|
42
43
|
}
|
|
43
|
-
const { queryParamName, multiple, filterable, hasClear, placeholder, options, allLabel, qa
|
|
44
|
-
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:
|
|
45
|
-
?
|
|
46
|
-
:
|
|
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
|
+
}) }) }));
|
|
47
50
|
};
|
|
48
51
|
exports.FilterControl = FilterControl;
|
|
49
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,14 +166,13 @@ 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 = {
|
|
173
173
|
selectedValues: string[];
|
|
174
174
|
changesCount: number;
|
|
175
175
|
};
|
|
176
|
-
export type DynamicAnalyticsEventsProp<T> = AnalyticsEventsProp | ((data: T) => AnalyticsEventsProp);
|
|
177
176
|
export type SelectFilterConfig = FilterConfigBase & Pick<SelectProps, 'multiple' | 'filterable' | 'hasClear' | 'placeholder'> & {
|
|
178
177
|
type?: 'select';
|
|
179
178
|
/** The selectable items for this filter */
|
|
@@ -182,22 +181,14 @@ export type SelectFilterConfig = FilterConfigBase & Pick<SelectProps, 'multiple'
|
|
|
182
181
|
allLabel: string;
|
|
183
182
|
/** Optional QA attribute forwarded to the switcher */
|
|
184
183
|
qa?: string;
|
|
185
|
-
/** Optional analytics events fired when the select opens */
|
|
186
|
-
openAnalyticsEvents?: AnalyticsEventsProp;
|
|
187
|
-
/** Optional analytics events fired when the select closes */
|
|
188
|
-
closeAnalyticsEvents?: DynamicAnalyticsEventsProp<SelectFilterCloseData>;
|
|
189
184
|
};
|
|
190
185
|
export type SearchFilterConfig = FilterConfigBase & {
|
|
191
186
|
type: 'search';
|
|
192
187
|
/** Placeholder text for the search input */
|
|
193
188
|
placeholder?: string;
|
|
194
|
-
/** Optional analytics events fired when the search input is clicked */
|
|
195
|
-
clickAnalyticsEvents?: AnalyticsEventsProp;
|
|
196
189
|
};
|
|
197
190
|
export type SavedOnlyFilterConfig = FilterConfigBase & {
|
|
198
191
|
type: 'savedOnly';
|
|
199
|
-
/** Optional analytics events fired with the next saved-only state */
|
|
200
|
-
clickAnalyticsEvents?: DynamicAnalyticsEventsProp<boolean>;
|
|
201
192
|
};
|
|
202
193
|
export type FilterConfig = SelectFilterConfig | SearchFilterConfig | SavedOnlyFilterConfig;
|
|
203
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,38 +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
|
|
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
|
+
};
|
|
12
17
|
export const FilterControl = ({ filter, initialValue, onChange }) => {
|
|
13
18
|
const handleAnalytics = useAnalytics();
|
|
14
19
|
const { hasLikes } = React.useContext(LikesContext);
|
|
15
|
-
const
|
|
20
|
+
const handleFilterAnalytics = React.useCallback((postfix, params) => {
|
|
16
21
|
if (filter.analyticsEvents) {
|
|
17
|
-
handleAnalytics(filter.analyticsEvents);
|
|
22
|
+
handleAnalytics(addAnalyticsEventPostfix(filter.analyticsEvents, postfix), params);
|
|
18
23
|
}
|
|
19
|
-
|
|
20
|
-
|
|
24
|
+
}, [filter.analyticsEvents, handleAnalytics]);
|
|
25
|
+
const handleChange = React.useCallback((query) => onChange(query), [onChange]);
|
|
21
26
|
if (filter.type === 'search') {
|
|
22
|
-
const { queryParamName, placeholder
|
|
23
|
-
return (_jsx("div", { className: b(), children: _jsx(SearchFilter, { placeholder: placeholder, initialValue: initialValue, onChange: (value) => handleChange({ [queryParamName]: value }), onClick:
|
|
24
|
-
? () => handleAnalytics(clickAnalyticsEvents)
|
|
25
|
-
: 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') }) }));
|
|
26
29
|
}
|
|
27
30
|
if (filter.type === 'savedOnly') {
|
|
28
|
-
const { queryParamName
|
|
31
|
+
const { queryParamName } = filter;
|
|
29
32
|
if (!hasLikes) {
|
|
30
33
|
return null;
|
|
31
34
|
}
|
|
32
35
|
const handleSavedOnlyChange = (value) => {
|
|
33
|
-
|
|
34
|
-
handleAnalytics(resolveAnalyticsEvents(clickAnalyticsEvents, value));
|
|
35
|
-
}
|
|
36
|
+
handleFilterAnalytics('CLICK', { state: value ? 'on' : 'off' });
|
|
36
37
|
handleChange({ [queryParamName]: value ? 'true' : '', search: '' });
|
|
37
38
|
};
|
|
38
39
|
return (_jsx("div", { className: b({ 'width-auto': true }), children: _jsx(SavedOnlyFilter, { initialValue: initialValue === 'true', onChange: handleSavedOnlyChange }) }));
|
|
39
40
|
}
|
|
40
|
-
const { queryParamName, multiple, filterable, hasClear, placeholder, options, allLabel, qa
|
|
41
|
-
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:
|
|
42
|
-
?
|
|
43
|
-
:
|
|
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
|
+
}) }) }));
|
|
44
47
|
};
|
|
45
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,14 +166,13 @@ 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 = {
|
|
173
173
|
selectedValues: string[];
|
|
174
174
|
changesCount: number;
|
|
175
175
|
};
|
|
176
|
-
export type DynamicAnalyticsEventsProp<T> = AnalyticsEventsProp | ((data: T) => AnalyticsEventsProp);
|
|
177
176
|
export type SelectFilterConfig = FilterConfigBase & Pick<SelectProps, 'multiple' | 'filterable' | 'hasClear' | 'placeholder'> & {
|
|
178
177
|
type?: 'select';
|
|
179
178
|
/** The selectable items for this filter */
|
|
@@ -182,22 +181,14 @@ export type SelectFilterConfig = FilterConfigBase & Pick<SelectProps, 'multiple'
|
|
|
182
181
|
allLabel: string;
|
|
183
182
|
/** Optional QA attribute forwarded to the switcher */
|
|
184
183
|
qa?: string;
|
|
185
|
-
/** Optional analytics events fired when the select opens */
|
|
186
|
-
openAnalyticsEvents?: AnalyticsEventsProp;
|
|
187
|
-
/** Optional analytics events fired when the select closes */
|
|
188
|
-
closeAnalyticsEvents?: DynamicAnalyticsEventsProp<SelectFilterCloseData>;
|
|
189
184
|
};
|
|
190
185
|
export type SearchFilterConfig = FilterConfigBase & {
|
|
191
186
|
type: 'search';
|
|
192
187
|
/** Placeholder text for the search input */
|
|
193
188
|
placeholder?: string;
|
|
194
|
-
/** Optional analytics events fired when the search input is clicked */
|
|
195
|
-
clickAnalyticsEvents?: AnalyticsEventsProp;
|
|
196
189
|
};
|
|
197
190
|
export type SavedOnlyFilterConfig = FilterConfigBase & {
|
|
198
191
|
type: 'savedOnly';
|
|
199
|
-
/** Optional analytics events fired with the next saved-only state */
|
|
200
|
-
clickAnalyticsEvents?: DynamicAnalyticsEventsProp<boolean>;
|
|
201
192
|
};
|
|
202
193
|
export type FilterConfig = SelectFilterConfig | SearchFilterConfig | SavedOnlyFilterConfig;
|
|
203
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,14 +166,13 @@ 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 = {
|
|
173
173
|
selectedValues: string[];
|
|
174
174
|
changesCount: number;
|
|
175
175
|
};
|
|
176
|
-
export type DynamicAnalyticsEventsProp<T> = AnalyticsEventsProp | ((data: T) => AnalyticsEventsProp);
|
|
177
176
|
export type SelectFilterConfig = FilterConfigBase & Pick<SelectProps, 'multiple' | 'filterable' | 'hasClear' | 'placeholder'> & {
|
|
178
177
|
type?: 'select';
|
|
179
178
|
/** The selectable items for this filter */
|
|
@@ -182,22 +181,14 @@ export type SelectFilterConfig = FilterConfigBase & Pick<SelectProps, 'multiple'
|
|
|
182
181
|
allLabel: string;
|
|
183
182
|
/** Optional QA attribute forwarded to the switcher */
|
|
184
183
|
qa?: string;
|
|
185
|
-
/** Optional analytics events fired when the select opens */
|
|
186
|
-
openAnalyticsEvents?: AnalyticsEventsProp;
|
|
187
|
-
/** Optional analytics events fired when the select closes */
|
|
188
|
-
closeAnalyticsEvents?: DynamicAnalyticsEventsProp<SelectFilterCloseData>;
|
|
189
184
|
};
|
|
190
185
|
export type SearchFilterConfig = FilterConfigBase & {
|
|
191
186
|
type: 'search';
|
|
192
187
|
/** Placeholder text for the search input */
|
|
193
188
|
placeholder?: string;
|
|
194
|
-
/** Optional analytics events fired when the search input is clicked */
|
|
195
|
-
clickAnalyticsEvents?: AnalyticsEventsProp;
|
|
196
189
|
};
|
|
197
190
|
export type SavedOnlyFilterConfig = FilterConfigBase & {
|
|
198
191
|
type: 'savedOnly';
|
|
199
|
-
/** Optional analytics events fired with the next saved-only state */
|
|
200
|
-
clickAnalyticsEvents?: DynamicAnalyticsEventsProp<boolean>;
|
|
201
192
|
};
|
|
202
193
|
export type FilterConfig = SelectFilterConfig | SearchFilterConfig | SavedOnlyFilterConfig;
|
|
203
194
|
/**
|