@doyourjob/gravity-ui-page-constructor 5.31.26 → 5.31.27

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 (47) hide show
  1. package/build/cjs/blocks/BlogFeed/BlogFeedPosts/BlogFeedPosts.css +0 -1
  2. package/build/cjs/blocks/RelevantPosts/RelevantPosts.css +8 -0
  3. package/build/cjs/blocks/RelevantPosts/RelevantPosts.d.ts +3 -0
  4. package/build/cjs/blocks/RelevantPosts/RelevantPosts.js +67 -0
  5. package/build/cjs/blocks/RelevantPosts/schema.d.ts +81 -0
  6. package/build/cjs/blocks/RelevantPosts/schema.js +52 -0
  7. package/build/cjs/blocks/index.d.ts +1 -0
  8. package/build/cjs/blocks/index.js +3 -1
  9. package/build/cjs/constructor-items.d.ts +1 -0
  10. package/build/cjs/constructor-items.js +1 -0
  11. package/build/cjs/context/relevantPostsContext/RelevantPostsContext.d.ts +21 -0
  12. package/build/cjs/context/relevantPostsContext/RelevantPostsContext.js +8 -0
  13. package/build/cjs/context/relevantPostsContext/index.d.ts +1 -0
  14. package/build/cjs/context/relevantPostsContext/index.js +4 -0
  15. package/build/cjs/index.d.ts +1 -0
  16. package/build/cjs/index.js +1 -0
  17. package/build/cjs/models/constructor-items/blocks.d.ts +15 -1
  18. package/build/cjs/models/constructor-items/blocks.js +1 -0
  19. package/build/cjs/schema/constants.js +2 -1
  20. package/build/cjs/schema/validators/blocks.d.ts +1 -0
  21. package/build/cjs/schema/validators/blocks.js +1 -0
  22. package/build/esm/blocks/BlogFeed/BlogFeedPosts/BlogFeedPosts.css +0 -1
  23. package/build/esm/blocks/RelevantPosts/RelevantPosts.css +8 -0
  24. package/build/esm/blocks/RelevantPosts/RelevantPosts.d.ts +4 -0
  25. package/build/esm/blocks/RelevantPosts/RelevantPosts.js +63 -0
  26. package/build/esm/blocks/RelevantPosts/schema.d.ts +81 -0
  27. package/build/esm/blocks/RelevantPosts/schema.js +49 -0
  28. package/build/esm/blocks/index.d.ts +1 -0
  29. package/build/esm/blocks/index.js +1 -0
  30. package/build/esm/constructor-items.d.ts +1 -0
  31. package/build/esm/constructor-items.js +2 -1
  32. package/build/esm/context/relevantPostsContext/RelevantPostsContext.d.ts +21 -0
  33. package/build/esm/context/relevantPostsContext/RelevantPostsContext.js +4 -0
  34. package/build/esm/context/relevantPostsContext/index.d.ts +1 -0
  35. package/build/esm/context/relevantPostsContext/index.js +1 -0
  36. package/build/esm/index.d.ts +1 -0
  37. package/build/esm/index.js +1 -0
  38. package/build/esm/models/constructor-items/blocks.d.ts +15 -1
  39. package/build/esm/models/constructor-items/blocks.js +1 -0
  40. package/build/esm/schema/constants.js +3 -2
  41. package/build/esm/schema/validators/blocks.d.ts +1 -0
  42. package/build/esm/schema/validators/blocks.js +1 -0
  43. package/package.json +1 -1
  44. package/schema/index.js +1 -1
  45. package/server/models/constructor-items/blocks.d.ts +15 -1
  46. package/server/models/constructor-items/blocks.js +1 -0
  47. package/widget/index.js +1 -1
@@ -2,5 +2,4 @@
2
2
  unpredictable css rules order in build */
3
3
  .pc-blog-feed-posts__wrap {
4
4
  padding-top: 24px;
5
- scroll-margin: 48px;
6
5
  }
@@ -0,0 +1,8 @@
1
+ /* use this for style redefinitions to awoid problems with
2
+ unpredictable css rules order in build */
3
+ .pc-relevant-posts__pinned {
4
+ padding-top: 48px;
5
+ }
6
+ .pc-relevant-posts__slider {
7
+ padding-top: 12px;
8
+ }
@@ -0,0 +1,3 @@
1
+ import { RelevantPostsBlockProps } from '../../models';
2
+ export declare const RelevantPosts: ({ title, date, tags, services, pinnedPost, }: RelevantPostsBlockProps) => JSX.Element | null;
3
+ export default RelevantPosts;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RelevantPosts = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importStar(require("react"));
6
+ const __1 = require("../..");
7
+ const relevantPostsContext_1 = require("../../context/relevantPostsContext");
8
+ const models_1 = require("../../models");
9
+ const PostCard_1 = tslib_1.__importDefault(require("../../sub-blocks/PostCard/PostCard"));
10
+ const utils_1 = require("../../utils");
11
+ const b = (0, utils_1.block)('relevant-posts');
12
+ const colSizes = {
13
+ xl: 3,
14
+ lg: 2,
15
+ sm: 1,
16
+ };
17
+ const RelevantPosts = ({ title, date, tags, services, pinnedPost, }) => {
18
+ const { posts } = (0, react_1.useContext)(relevantPostsContext_1.RelevantPostsContext);
19
+ const filteredPosts = (0, react_1.useMemo)(() => posts.filter((item) => {
20
+ var _a, _b;
21
+ const now = new Date();
22
+ const itemDate = new Date(item.dateTime);
23
+ let isDateMatch = true;
24
+ if (date === 'today') {
25
+ const startOfToday = new Date(now);
26
+ startOfToday.setHours(0, 0, 0, 0);
27
+ const endOfToday = new Date(now);
28
+ endOfToday.setHours(23, 59, 59, 999);
29
+ isDateMatch = itemDate >= startOfToday && itemDate <= endOfToday;
30
+ }
31
+ else if (date === 'week') {
32
+ const weekAgo = new Date(now);
33
+ weekAgo.setDate(now.getDate() - 7);
34
+ isDateMatch = itemDate >= weekAgo && itemDate <= now;
35
+ }
36
+ else if (date === 'month') {
37
+ const monthAgo = new Date(now);
38
+ monthAgo.setMonth(now.getMonth() - 1);
39
+ isDateMatch = itemDate >= monthAgo && itemDate <= now;
40
+ }
41
+ else if (typeof date === 'object' && (date.start || date.end)) {
42
+ const startDate = date.start ? new Date(date.start) : new Date('1970-01-01');
43
+ const endDate = date.end ? new Date(date.end) : now;
44
+ isDateMatch = itemDate >= startDate && itemDate <= endDate;
45
+ }
46
+ // Фильтрация по тегам
47
+ const isTagMatch = !tags || tags.length === 0 || ((_a = item.tags) === null || _a === void 0 ? void 0 : _a.some((tag) => tags.includes(tag.slug)));
48
+ // Фильтрация по сервисам
49
+ const isServiceMatch = !services ||
50
+ services.length === 0 ||
51
+ ((_b = item.services) === null || _b === void 0 ? void 0 : _b.some((s) => services.includes(s)));
52
+ return isDateMatch && isTagMatch && isServiceMatch;
53
+ }), [posts, date, tags, services]);
54
+ const findedPinnedPost = (0, react_1.useMemo)(() => filteredPosts.find((item) => item.slug === pinnedPost), [filteredPosts, pinnedPost]);
55
+ const finishPosts = (0, react_1.useMemo)(() => filteredPosts.filter((item) => item.slug !== pinnedPost), [filteredPosts, pinnedPost]);
56
+ if (filteredPosts.length === 0) {
57
+ return null;
58
+ }
59
+ return (react_1.default.createElement("div", { className: b() },
60
+ react_1.default.createElement(__1.Title, { title: title }),
61
+ findedPinnedPost && (react_1.default.createElement("div", { className: b('pinned') },
62
+ react_1.default.createElement(PostCard_1.default, Object.assign({}, findedPinnedPost, { size: models_1.PostCardSize.MEDIUM, fullWidth: true, showTag: true })))),
63
+ react_1.default.createElement("div", { className: b('slider') },
64
+ react_1.default.createElement(__1.SliderBlock, { slidesToShow: colSizes }, finishPosts.map((item) => (react_1.default.createElement(PostCard_1.default, Object.assign({ key: item.slug }, item, { showTag: true }))))))));
65
+ };
66
+ exports.RelevantPosts = RelevantPosts;
67
+ exports.default = exports.RelevantPosts;
@@ -0,0 +1,81 @@
1
+ export declare const RelevantPostsBlock: {
2
+ 'relevant-posts-block': {
3
+ additionalProperties: boolean;
4
+ required: never[];
5
+ properties: {
6
+ title: {
7
+ oneOf: ({
8
+ type: string;
9
+ optionName: string;
10
+ } | {
11
+ optionName: string;
12
+ type: string;
13
+ additionalProperties: boolean;
14
+ required: string[];
15
+ properties: {
16
+ text: {
17
+ type: string;
18
+ contentType: string;
19
+ };
20
+ textSize: {
21
+ type: string;
22
+ enum: string[];
23
+ };
24
+ url: {
25
+ type: string;
26
+ };
27
+ urlTitle: {
28
+ type: string;
29
+ };
30
+ resetMargin: {
31
+ type: string;
32
+ };
33
+ };
34
+ })[];
35
+ };
36
+ date: {
37
+ oneOf: ({
38
+ type: string;
39
+ enum: string[];
40
+ additionalProperties?: undefined;
41
+ required?: undefined;
42
+ properties?: undefined;
43
+ optionName?: undefined;
44
+ } | {
45
+ type: string;
46
+ additionalProperties: boolean;
47
+ required: never[];
48
+ properties: {
49
+ start: {
50
+ type: string;
51
+ };
52
+ end: {
53
+ type: string;
54
+ };
55
+ };
56
+ optionName: string;
57
+ enum?: undefined;
58
+ })[];
59
+ };
60
+ tags: {
61
+ type: string;
62
+ items: {
63
+ type: string;
64
+ };
65
+ };
66
+ services: {
67
+ type: string;
68
+ items: {
69
+ type: string;
70
+ };
71
+ };
72
+ pinnedPost: {
73
+ type: string;
74
+ };
75
+ type: {};
76
+ when: {
77
+ type: string;
78
+ };
79
+ };
80
+ };
81
+ };
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RelevantPostsBlock = void 0;
4
+ const common_1 = require("./../../schema/validators/common");
5
+ exports.RelevantPostsBlock = {
6
+ 'relevant-posts-block': {
7
+ additionalProperties: false,
8
+ required: [],
9
+ properties: Object.assign(Object.assign({}, common_1.BaseProps), { title: {
10
+ oneOf: [
11
+ {
12
+ type: 'string',
13
+ optionName: 'text',
14
+ },
15
+ Object.assign(Object.assign({}, common_1.TitleProps), { optionName: 'options' }),
16
+ ],
17
+ }, date: {
18
+ oneOf: [
19
+ {
20
+ type: 'string',
21
+ enum: ['today', 'week', 'month'],
22
+ },
23
+ {
24
+ type: 'object',
25
+ additionalProperties: false,
26
+ required: [],
27
+ properties: {
28
+ start: {
29
+ type: 'string',
30
+ },
31
+ end: {
32
+ type: 'string',
33
+ },
34
+ },
35
+ optionName: 'options',
36
+ },
37
+ ],
38
+ }, tags: {
39
+ type: 'array',
40
+ items: {
41
+ type: 'string',
42
+ },
43
+ }, services: {
44
+ type: 'array',
45
+ items: {
46
+ type: 'string',
47
+ },
48
+ }, pinnedPost: {
49
+ type: 'string',
50
+ } }),
51
+ },
52
+ };
@@ -24,5 +24,6 @@ export { default as QuotesBlock } from './Quotes/Quotes';
24
24
  export { default as LinkTableBlock } from './LinkTable/LinkTable';
25
25
  export { default as EventsFeedBlock } from './EventsFeed/EventsFeed';
26
26
  export { default as BlogFeedBlock } from './BlogFeed/BlogFeed';
27
+ export { default as RelevantPostsBlock } from './RelevantPosts/RelevantPosts';
27
28
  export { default as PressReleasesBlock } from './PressReleases/PressReleases';
28
29
  export { default as HighlightTableBlock } from './HighlightTable/HighlightTable';
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.HighlightTableBlock = exports.PressReleasesBlock = exports.BlogFeedBlock = exports.EventsFeedBlock = exports.LinkTableBlock = exports.QuotesBlock = exports.ServicesBlock = exports.SolutionsBlock = exports.MarqueeLinksBlock = exports.FormBlock = exports.FilterBlock = exports.ShareBlock = exports.ContentLayoutBlock = exports.CardLayoutBlock = exports.HeaderSliderBlock = exports.IconsBlock = exports.HeaderBlock = exports.TabsBlock = exports.TableBlock = exports.QuestionsBlock = exports.PromoFeaturesBlock = exports.ExtendedFeaturesBlock = exports.SliderBlock = exports.MapBlock = exports.MediaBlock = exports.InfoBlock = exports.CompaniesBlock = exports.BannerBlock = void 0;
6
+ exports.HighlightTableBlock = exports.PressReleasesBlock = exports.RelevantPostsBlock = exports.BlogFeedBlock = exports.EventsFeedBlock = exports.LinkTableBlock = exports.QuotesBlock = exports.ServicesBlock = exports.SolutionsBlock = exports.MarqueeLinksBlock = exports.FormBlock = exports.FilterBlock = exports.ShareBlock = exports.ContentLayoutBlock = exports.CardLayoutBlock = exports.HeaderSliderBlock = exports.IconsBlock = exports.HeaderBlock = exports.TabsBlock = exports.TableBlock = exports.QuestionsBlock = exports.PromoFeaturesBlock = exports.ExtendedFeaturesBlock = exports.SliderBlock = exports.MapBlock = exports.MediaBlock = exports.InfoBlock = exports.CompaniesBlock = exports.BannerBlock = void 0;
7
7
  var Banner_1 = require("./Banner/Banner");
8
8
  Object.defineProperty(exports, "BannerBlock", { enumerable: true, get: function () { return __importDefault(Banner_1).default; } });
9
9
  var Companies_1 = require("./Companies/Companies");
@@ -56,6 +56,8 @@ var EventsFeed_1 = require("./EventsFeed/EventsFeed");
56
56
  Object.defineProperty(exports, "EventsFeedBlock", { enumerable: true, get: function () { return __importDefault(EventsFeed_1).default; } });
57
57
  var BlogFeed_1 = require("./BlogFeed/BlogFeed");
58
58
  Object.defineProperty(exports, "BlogFeedBlock", { enumerable: true, get: function () { return __importDefault(BlogFeed_1).default; } });
59
+ var RelevantPosts_1 = require("./RelevantPosts/RelevantPosts");
60
+ Object.defineProperty(exports, "RelevantPostsBlock", { enumerable: true, get: function () { return __importDefault(RelevantPosts_1).default; } });
59
61
  var PressReleases_1 = require("./PressReleases/PressReleases");
60
62
  Object.defineProperty(exports, "PressReleasesBlock", { enumerable: true, get: function () { return __importDefault(PressReleases_1).default; } });
61
63
  var HighlightTable_1 = require("./HighlightTable/HighlightTable");
@@ -22,6 +22,7 @@ export declare const blockMap: {
22
22
  "solutions-block": () => JSX.Element;
23
23
  "events-feed-block": ({ image, title }: import("./models").EventsFeedBlockProps) => JSX.Element;
24
24
  "blog-feed-block": ({ image, title }: import("./models").BlogFeedBlockProps) => JSX.Element;
25
+ "relevant-posts-block": ({ title, date, tags, services, pinnedPost, }: import("./models").RelevantPostsBlockProps) => JSX.Element | null;
25
26
  "press-releases-block": ({ title }: import("./models").PressReleasesBlockProps) => JSX.Element;
26
27
  "highlight-table-block": (props: import("./models").HighlightTableBlockProps) => JSX.Element;
27
28
  "link-table-block": ({ title, items }: import("./models").LinkTableBlockProps) => JSX.Element;
@@ -32,6 +32,7 @@ exports.blockMap = {
32
32
  [models_1.BlockType.SolutionsBlock]: blocks_1.SolutionsBlock,
33
33
  [models_1.BlockType.EventsFeedBlock]: blocks_1.EventsFeedBlock,
34
34
  [models_1.BlockType.BlogFeedBlock]: blocks_1.BlogFeedBlock,
35
+ [models_1.BlockType.RelevantPostsBlock]: blocks_1.RelevantPostsBlock,
35
36
  [models_1.BlockType.PressReleasesBlock]: blocks_1.PressReleasesBlock,
36
37
  [models_1.BlockType.HighlightTableBlock]: blocks_1.HighlightTableBlock,
37
38
  [models_1.BlockType.LinkTableBlock]: blocks_1.LinkTableBlock,
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ export type RelevantPostData = {
3
+ date: string;
4
+ dateTime: string;
5
+ description?: string;
6
+ image: string;
7
+ readingTime?: number;
8
+ slug: string;
9
+ tags: {
10
+ slug: string;
11
+ name: string;
12
+ }[];
13
+ services: string[];
14
+ title: string;
15
+ url: string;
16
+ };
17
+ export interface RelevantPostsContextProps {
18
+ pinnedPost?: string;
19
+ posts: RelevantPostData[];
20
+ }
21
+ export declare const RelevantPostsContext: React.Context<RelevantPostsContextProps>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RelevantPostsContext = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ exports.RelevantPostsContext = react_1.default.createContext({
7
+ posts: [],
8
+ });
@@ -0,0 +1 @@
1
+ export * from './RelevantPostsContext';
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./RelevantPostsContext"), exports);
@@ -9,6 +9,7 @@ export * from './context/eventsContext';
9
9
  export * from './context/blogPostsContext';
10
10
  export * from './context/pressReleasesContext';
11
11
  export * from './context/headerContext';
12
+ export * from './context/relevantPostsContext';
12
13
  export * from './containers/PageConstructor';
13
14
  export * from './grid';
14
15
  export * from './blocks';
@@ -14,6 +14,7 @@ tslib_1.__exportStar(require("./context/eventsContext"), exports);
14
14
  tslib_1.__exportStar(require("./context/blogPostsContext"), exports);
15
15
  tslib_1.__exportStar(require("./context/pressReleasesContext"), exports);
16
16
  tslib_1.__exportStar(require("./context/headerContext"), exports);
17
+ tslib_1.__exportStar(require("./context/relevantPostsContext"), exports);
17
18
  tslib_1.__exportStar(require("./containers/PageConstructor"), exports);
18
19
  tslib_1.__exportStar(require("./grid"), exports);
19
20
  tslib_1.__exportStar(require("./blocks"), exports);
@@ -32,6 +32,7 @@ export declare enum BlockType {
32
32
  LinkTableBlock = "link-table-block",
33
33
  EventsFeedBlock = "events-feed-block",
34
34
  BlogFeedBlock = "blog-feed-block",
35
+ RelevantPostsBlock = "relevant-posts-block",
35
36
  PressReleasesBlock = "press-releases-block",
36
37
  SliderNewBlock = "slider-new-block",
37
38
  HighlightTableBlock = "highlight-table-block"
@@ -307,6 +308,16 @@ export interface BlogFeedBlockProps {
307
308
  image?: string;
308
309
  title?: string;
309
310
  }
311
+ export interface RelevantPostsBlockProps {
312
+ title?: TitleItemProps | string;
313
+ date?: {
314
+ start?: string;
315
+ end?: string;
316
+ } | 'today' | 'week' | 'month';
317
+ tags?: string[];
318
+ services?: string[];
319
+ pinnedPost?: string;
320
+ }
310
321
  export interface PressReleasesBlockProps {
311
322
  title?: string;
312
323
  }
@@ -528,13 +539,16 @@ export type EventsFeedBlockModel = {
528
539
  export type BlogFeedBlockModel = {
529
540
  type: BlockType.BlogFeedBlock;
530
541
  } & BlogFeedBlockProps;
542
+ export type RelevantPostsBlockModel = {
543
+ type: BlockType.RelevantPostsBlock;
544
+ } & RelevantPostsBlockProps;
531
545
  export type PressReleasesBlockModel = {
532
546
  type: BlockType.PressReleasesBlock;
533
547
  } & PressReleasesBlockProps;
534
548
  export type SliderNewBlockModel = {
535
549
  type: BlockType.SliderNewBlock;
536
550
  } & SliderNewProps;
537
- type BlockModels = SliderBlockModel | ExtendedFeaturesBlockModel | PromoFeaturesBlockModel | QuestionsBlockModel | BannerBlockModel | CompaniesBlockModel | MediaBlockModel | MapBlockModel | InfoBlockModel | TableBlockModel | HighlightTableBlockModel | TabsBlockModel | HeaderBlockModel | IconsBlockModel | HeaderSliderBlockModel | CardLayoutBlockModel | ContentLayoutBlockModel | ShareBLockModel | FilterBlockModel | FormBlockModel | MarqueeLinksBlockModel | SolutionsBlockModel | ServicesBlockModel | QuotesBlockModel | LinkTableBlockModel | EventsFeedBlockModel | BlogFeedBlockModel | PressReleasesBlockModel;
551
+ type BlockModels = SliderBlockModel | ExtendedFeaturesBlockModel | PromoFeaturesBlockModel | QuestionsBlockModel | BannerBlockModel | CompaniesBlockModel | MediaBlockModel | MapBlockModel | InfoBlockModel | TableBlockModel | HighlightTableBlockModel | TabsBlockModel | HeaderBlockModel | IconsBlockModel | HeaderSliderBlockModel | CardLayoutBlockModel | ContentLayoutBlockModel | ShareBLockModel | FilterBlockModel | FormBlockModel | MarqueeLinksBlockModel | SolutionsBlockModel | ServicesBlockModel | QuotesBlockModel | LinkTableBlockModel | EventsFeedBlockModel | BlogFeedBlockModel | RelevantPostsBlockModel | PressReleasesBlockModel;
538
552
  type UnstableBlockModels = SliderNewBlockModel;
539
553
  export type Block = (BlockModels | UnstableBlockModels) & BlockBaseProps;
540
554
  export {};
@@ -29,6 +29,7 @@ var BlockType;
29
29
  BlockType["LinkTableBlock"] = "link-table-block";
30
30
  BlockType["EventsFeedBlock"] = "events-feed-block";
31
31
  BlockType["BlogFeedBlock"] = "blog-feed-block";
32
+ BlockType["RelevantPostsBlock"] = "relevant-posts-block";
32
33
  BlockType["PressReleasesBlock"] = "press-releases-block";
33
34
  // unstable
34
35
  BlockType["SliderNewBlock"] = "slider-new-block";
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.constructorCardSchemaNames = exports.constructorBlockSchemaNames = exports.cardSchemas = exports.blockSchemas = void 0;
4
4
  const blocks_1 = require("./validators/blocks");
5
5
  const sub_blocks_1 = require("./validators/sub-blocks");
6
- exports.blockSchemas = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, sub_blocks_1.Divider), blocks_1.ExtendedFeaturesBlock), blocks_1.PromoFeaturesBlock), blocks_1.SliderBlock), blocks_1.QuestionsBlock), blocks_1.HeaderBlock), blocks_1.BannerBlock), blocks_1.CompaniesBlock), blocks_1.MediaBlock), blocks_1.MapBlock), blocks_1.InfoBlock), blocks_1.TableBlock), blocks_1.HighlightTableBlock), blocks_1.TabsBlock), blocks_1.HeaderSliderBlock), blocks_1.IconsBlock), blocks_1.CardLayoutBlock), blocks_1.ContentLayoutBlock), blocks_1.ShareBlock), blocks_1.FilterBlock), blocks_1.FormBlock), blocks_1.SliderNewBlock), blocks_1.MarqueeLinksBlock), blocks_1.SolutionsBlock), blocks_1.ServicesBlock), blocks_1.QuotesBlock), blocks_1.LinkTableBlock), blocks_1.EventsFeedBlock), blocks_1.BlogFeedBlock), blocks_1.PressReleasesBlock);
6
+ exports.blockSchemas = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, sub_blocks_1.Divider), blocks_1.ExtendedFeaturesBlock), blocks_1.PromoFeaturesBlock), blocks_1.SliderBlock), blocks_1.QuestionsBlock), blocks_1.HeaderBlock), blocks_1.BannerBlock), blocks_1.CompaniesBlock), blocks_1.MediaBlock), blocks_1.MapBlock), blocks_1.InfoBlock), blocks_1.TableBlock), blocks_1.HighlightTableBlock), blocks_1.TabsBlock), blocks_1.HeaderSliderBlock), blocks_1.IconsBlock), blocks_1.CardLayoutBlock), blocks_1.ContentLayoutBlock), blocks_1.ShareBlock), blocks_1.FilterBlock), blocks_1.FormBlock), blocks_1.SliderNewBlock), blocks_1.MarqueeLinksBlock), blocks_1.SolutionsBlock), blocks_1.ServicesBlock), blocks_1.QuotesBlock), blocks_1.LinkTableBlock), blocks_1.EventsFeedBlock), blocks_1.BlogFeedBlock), blocks_1.RelevantPostsBlock), blocks_1.PressReleasesBlock);
7
7
  exports.cardSchemas = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, sub_blocks_1.MediaCardBlock), blocks_1.BannerCard), sub_blocks_1.PriceDetailedBlock), sub_blocks_1.BackgroundCard), sub_blocks_1.Quote), sub_blocks_1.BasicCard), sub_blocks_1.PriceCardBlock), sub_blocks_1.ImageCard), sub_blocks_1.ContentLayoutCard), sub_blocks_1.Card), sub_blocks_1.PostCard), sub_blocks_1.FeedCard);
8
8
  exports.constructorBlockSchemaNames = [
9
9
  'divider',
@@ -40,6 +40,7 @@ exports.constructorBlockSchemaNames = [
40
40
  'events-feed-block',
41
41
  'blog-feed-block',
42
42
  'highlight-table-block',
43
+ 'relevant-posts-block',
43
44
  ];
44
45
  exports.constructorCardSchemaNames = [
45
46
  'media-card',
@@ -25,5 +25,6 @@ export * from '../../blocks/Quotes/schema';
25
25
  export * from '../../blocks/LinkTable/schema';
26
26
  export * from '../../blocks/EventsFeed/schema';
27
27
  export * from '../../blocks/BlogFeed/schema';
28
+ export * from '../../blocks/RelevantPosts/schema';
28
29
  export * from '../../blocks/PressReleases/schema';
29
30
  export * from '../../blocks/HighlightTable/schema';
@@ -28,5 +28,6 @@ tslib_1.__exportStar(require("../../blocks/Quotes/schema"), exports);
28
28
  tslib_1.__exportStar(require("../../blocks/LinkTable/schema"), exports);
29
29
  tslib_1.__exportStar(require("../../blocks/EventsFeed/schema"), exports);
30
30
  tslib_1.__exportStar(require("../../blocks/BlogFeed/schema"), exports);
31
+ tslib_1.__exportStar(require("../../blocks/RelevantPosts/schema"), exports);
31
32
  tslib_1.__exportStar(require("../../blocks/PressReleases/schema"), exports);
32
33
  tslib_1.__exportStar(require("../../blocks/HighlightTable/schema"), exports);
@@ -2,5 +2,4 @@
2
2
  unpredictable css rules order in build */
3
3
  .pc-blog-feed-posts__wrap {
4
4
  padding-top: 24px;
5
- scroll-margin: 48px;
6
5
  }
@@ -0,0 +1,8 @@
1
+ /* use this for style redefinitions to awoid problems with
2
+ unpredictable css rules order in build */
3
+ .pc-relevant-posts__pinned {
4
+ padding-top: 48px;
5
+ }
6
+ .pc-relevant-posts__slider {
7
+ padding-top: 12px;
8
+ }
@@ -0,0 +1,4 @@
1
+ import { RelevantPostsBlockProps } from '../../models';
2
+ import './RelevantPosts.css';
3
+ export declare const RelevantPosts: ({ title, date, tags, services, pinnedPost, }: RelevantPostsBlockProps) => JSX.Element | null;
4
+ export default RelevantPosts;
@@ -0,0 +1,63 @@
1
+ import React, { useContext, useMemo } from 'react';
2
+ import { SliderBlock, Title } from '../..';
3
+ import { RelevantPostsContext } from '../../context/relevantPostsContext';
4
+ import { PostCardSize } from '../../models';
5
+ import PostCard from '../../sub-blocks/PostCard/PostCard';
6
+ import { block } from '../../utils';
7
+ import './RelevantPosts.css';
8
+ const b = block('relevant-posts');
9
+ const colSizes = {
10
+ xl: 3,
11
+ lg: 2,
12
+ sm: 1,
13
+ };
14
+ export const RelevantPosts = ({ title, date, tags, services, pinnedPost, }) => {
15
+ const { posts } = useContext(RelevantPostsContext);
16
+ const filteredPosts = useMemo(() => posts.filter((item) => {
17
+ var _a, _b;
18
+ const now = new Date();
19
+ const itemDate = new Date(item.dateTime);
20
+ let isDateMatch = true;
21
+ if (date === 'today') {
22
+ const startOfToday = new Date(now);
23
+ startOfToday.setHours(0, 0, 0, 0);
24
+ const endOfToday = new Date(now);
25
+ endOfToday.setHours(23, 59, 59, 999);
26
+ isDateMatch = itemDate >= startOfToday && itemDate <= endOfToday;
27
+ }
28
+ else if (date === 'week') {
29
+ const weekAgo = new Date(now);
30
+ weekAgo.setDate(now.getDate() - 7);
31
+ isDateMatch = itemDate >= weekAgo && itemDate <= now;
32
+ }
33
+ else if (date === 'month') {
34
+ const monthAgo = new Date(now);
35
+ monthAgo.setMonth(now.getMonth() - 1);
36
+ isDateMatch = itemDate >= monthAgo && itemDate <= now;
37
+ }
38
+ else if (typeof date === 'object' && (date.start || date.end)) {
39
+ const startDate = date.start ? new Date(date.start) : new Date('1970-01-01');
40
+ const endDate = date.end ? new Date(date.end) : now;
41
+ isDateMatch = itemDate >= startDate && itemDate <= endDate;
42
+ }
43
+ // Фильтрация по тегам
44
+ const isTagMatch = !tags || tags.length === 0 || ((_a = item.tags) === null || _a === void 0 ? void 0 : _a.some((tag) => tags.includes(tag.slug)));
45
+ // Фильтрация по сервисам
46
+ const isServiceMatch = !services ||
47
+ services.length === 0 ||
48
+ ((_b = item.services) === null || _b === void 0 ? void 0 : _b.some((s) => services.includes(s)));
49
+ return isDateMatch && isTagMatch && isServiceMatch;
50
+ }), [posts, date, tags, services]);
51
+ const findedPinnedPost = useMemo(() => filteredPosts.find((item) => item.slug === pinnedPost), [filteredPosts, pinnedPost]);
52
+ const finishPosts = useMemo(() => filteredPosts.filter((item) => item.slug !== pinnedPost), [filteredPosts, pinnedPost]);
53
+ if (filteredPosts.length === 0) {
54
+ return null;
55
+ }
56
+ return (React.createElement("div", { className: b() },
57
+ React.createElement(Title, { title: title }),
58
+ findedPinnedPost && (React.createElement("div", { className: b('pinned') },
59
+ React.createElement(PostCard, Object.assign({}, findedPinnedPost, { size: PostCardSize.MEDIUM, fullWidth: true, showTag: true })))),
60
+ React.createElement("div", { className: b('slider') },
61
+ React.createElement(SliderBlock, { slidesToShow: colSizes }, finishPosts.map((item) => (React.createElement(PostCard, Object.assign({ key: item.slug }, item, { showTag: true }))))))));
62
+ };
63
+ export default RelevantPosts;
@@ -0,0 +1,81 @@
1
+ export declare const RelevantPostsBlock: {
2
+ 'relevant-posts-block': {
3
+ additionalProperties: boolean;
4
+ required: never[];
5
+ properties: {
6
+ title: {
7
+ oneOf: ({
8
+ type: string;
9
+ optionName: string;
10
+ } | {
11
+ optionName: string;
12
+ type: string;
13
+ additionalProperties: boolean;
14
+ required: string[];
15
+ properties: {
16
+ text: {
17
+ type: string;
18
+ contentType: string;
19
+ };
20
+ textSize: {
21
+ type: string;
22
+ enum: string[];
23
+ };
24
+ url: {
25
+ type: string;
26
+ };
27
+ urlTitle: {
28
+ type: string;
29
+ };
30
+ resetMargin: {
31
+ type: string;
32
+ };
33
+ };
34
+ })[];
35
+ };
36
+ date: {
37
+ oneOf: ({
38
+ type: string;
39
+ enum: string[];
40
+ additionalProperties?: undefined;
41
+ required?: undefined;
42
+ properties?: undefined;
43
+ optionName?: undefined;
44
+ } | {
45
+ type: string;
46
+ additionalProperties: boolean;
47
+ required: never[];
48
+ properties: {
49
+ start: {
50
+ type: string;
51
+ };
52
+ end: {
53
+ type: string;
54
+ };
55
+ };
56
+ optionName: string;
57
+ enum?: undefined;
58
+ })[];
59
+ };
60
+ tags: {
61
+ type: string;
62
+ items: {
63
+ type: string;
64
+ };
65
+ };
66
+ services: {
67
+ type: string;
68
+ items: {
69
+ type: string;
70
+ };
71
+ };
72
+ pinnedPost: {
73
+ type: string;
74
+ };
75
+ type: {};
76
+ when: {
77
+ type: string;
78
+ };
79
+ };
80
+ };
81
+ };
@@ -0,0 +1,49 @@
1
+ import { BaseProps, TitleProps } from './../../schema/validators/common';
2
+ export const RelevantPostsBlock = {
3
+ 'relevant-posts-block': {
4
+ additionalProperties: false,
5
+ required: [],
6
+ properties: Object.assign(Object.assign({}, BaseProps), { title: {
7
+ oneOf: [
8
+ {
9
+ type: 'string',
10
+ optionName: 'text',
11
+ },
12
+ Object.assign(Object.assign({}, TitleProps), { optionName: 'options' }),
13
+ ],
14
+ }, date: {
15
+ oneOf: [
16
+ {
17
+ type: 'string',
18
+ enum: ['today', 'week', 'month'],
19
+ },
20
+ {
21
+ type: 'object',
22
+ additionalProperties: false,
23
+ required: [],
24
+ properties: {
25
+ start: {
26
+ type: 'string',
27
+ },
28
+ end: {
29
+ type: 'string',
30
+ },
31
+ },
32
+ optionName: 'options',
33
+ },
34
+ ],
35
+ }, tags: {
36
+ type: 'array',
37
+ items: {
38
+ type: 'string',
39
+ },
40
+ }, services: {
41
+ type: 'array',
42
+ items: {
43
+ type: 'string',
44
+ },
45
+ }, pinnedPost: {
46
+ type: 'string',
47
+ } }),
48
+ },
49
+ };
@@ -24,5 +24,6 @@ export { default as QuotesBlock } from './Quotes/Quotes';
24
24
  export { default as LinkTableBlock } from './LinkTable/LinkTable';
25
25
  export { default as EventsFeedBlock } from './EventsFeed/EventsFeed';
26
26
  export { default as BlogFeedBlock } from './BlogFeed/BlogFeed';
27
+ export { default as RelevantPostsBlock } from './RelevantPosts/RelevantPosts';
27
28
  export { default as PressReleasesBlock } from './PressReleases/PressReleases';
28
29
  export { default as HighlightTableBlock } from './HighlightTable/HighlightTable';