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

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 +76 -0
  5. package/build/cjs/blocks/RelevantPosts/schema.d.ts +86 -0
  6. package/build/cjs/blocks/RelevantPosts/schema.js +44 -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 +20 -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 +16 -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 +72 -0
  26. package/build/esm/blocks/RelevantPosts/schema.d.ts +86 -0
  27. package/build/esm/blocks/RelevantPosts/schema.js +41 -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 +20 -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 +16 -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 +16 -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, description, date, tags, services, pinnedPost, }: RelevantPostsBlockProps) => JSX.Element;
3
+ export default RelevantPosts;
@@ -0,0 +1,76 @@
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, description, date, tags, services, pinnedPost, }) => {
18
+ const [now, setNow] = react_1.default.useState(null);
19
+ const { posts } = (0, react_1.useContext)(relevantPostsContext_1.RelevantPostsContext);
20
+ (0, react_1.useEffect)(() => {
21
+ setNow(new Date());
22
+ }, []);
23
+ const filteredPosts = (0, react_1.useMemo)(() => {
24
+ if (!now)
25
+ return [];
26
+ return posts.filter((item) => {
27
+ var _a, _b;
28
+ const itemDate = new Date(item.dateTime);
29
+ let isDateMatch = true;
30
+ if (date === 'today') {
31
+ const startOfToday = new Date(now);
32
+ startOfToday.setHours(0, 0, 0, 0);
33
+ const endOfToday = new Date(now);
34
+ endOfToday.setHours(23, 59, 59, 999);
35
+ isDateMatch = itemDate >= startOfToday && itemDate <= endOfToday;
36
+ }
37
+ else if (date === 'week') {
38
+ const weekAgo = new Date(now);
39
+ weekAgo.setDate(now.getDate() - 7);
40
+ isDateMatch = itemDate >= weekAgo && itemDate <= now;
41
+ }
42
+ else if (date === 'month') {
43
+ const monthAgo = new Date(now);
44
+ monthAgo.setMonth(now.getMonth() - 1);
45
+ isDateMatch = itemDate >= monthAgo && itemDate <= now;
46
+ }
47
+ else if (typeof date === 'object' && (date.start || date.end)) {
48
+ const startDate = date.start ? new Date(date.start) : new Date('1970-01-01');
49
+ const endDate = date.end ? new Date(date.end) : now;
50
+ isDateMatch = itemDate >= startDate && itemDate <= endDate;
51
+ }
52
+ // Фильтрация по тегам
53
+ const isTagMatch = !tags || tags.length === 0 || ((_a = item.tags) === null || _a === void 0 ? void 0 : _a.some((tag) => tags.includes(tag.slug)));
54
+ // Фильтрация по сервисам
55
+ const isServiceMatch = !services ||
56
+ services.length === 0 ||
57
+ ((_b = item.services) === null || _b === void 0 ? void 0 : _b.some((s) => services.includes(s)));
58
+ return isDateMatch && isTagMatch && isServiceMatch;
59
+ });
60
+ }, [now, posts, date, tags, services]);
61
+ const [findedPinnedPost, restPosts] = (0, react_1.useMemo)(() => {
62
+ if (!pinnedPost || filteredPosts.length === 0)
63
+ return [undefined, filteredPosts];
64
+ const postsCopy = [...filteredPosts];
65
+ const pinned = postsCopy.pop(); // безопасно
66
+ return [pinned, postsCopy];
67
+ }, [filteredPosts, pinnedPost]);
68
+ return (react_1.default.createElement("div", { className: b() },
69
+ (title || description) && react_1.default.createElement(__1.Title, { title: title, subtitle: description }),
70
+ findedPinnedPost && (react_1.default.createElement("div", { className: b('pinned') },
71
+ react_1.default.createElement(PostCard_1.default, Object.assign({}, findedPinnedPost, { size: models_1.PostCardSize.MEDIUM, fullWidth: true, showTag: true })))),
72
+ restPosts.length > 0 && (react_1.default.createElement("div", { className: b('slider') },
73
+ react_1.default.createElement(__1.SliderBlock, { slidesToShow: colSizes }, restPosts.map((item) => (react_1.default.createElement(PostCard_1.default, Object.assign({ key: item.slug }, item, { showTag: true })))))))));
74
+ };
75
+ exports.RelevantPosts = RelevantPosts;
76
+ exports.default = exports.RelevantPosts;
@@ -0,0 +1,86 @@
1
+ export declare const RelevantPostsBlock: {
2
+ 'relevant-posts-block': {
3
+ additionalProperties: boolean;
4
+ required: never[];
5
+ properties: {
6
+ date: {
7
+ oneOf: ({
8
+ type: string;
9
+ enum: string[];
10
+ additionalProperties?: undefined;
11
+ required?: undefined;
12
+ properties?: undefined;
13
+ optionName?: undefined;
14
+ } | {
15
+ type: string;
16
+ additionalProperties: boolean;
17
+ required: never[];
18
+ properties: {
19
+ start: {
20
+ type: string;
21
+ };
22
+ end: {
23
+ type: string;
24
+ };
25
+ };
26
+ optionName: string;
27
+ enum?: undefined;
28
+ })[];
29
+ };
30
+ tags: {
31
+ type: string;
32
+ items: {
33
+ type: string;
34
+ };
35
+ };
36
+ services: {
37
+ type: string;
38
+ items: {
39
+ type: string;
40
+ };
41
+ };
42
+ pinnedPost: {
43
+ type: string;
44
+ };
45
+ title: {
46
+ oneOf: ({
47
+ type: string;
48
+ optionName: string;
49
+ } | {
50
+ optionName: string;
51
+ type: string;
52
+ additionalProperties: boolean;
53
+ required: string[];
54
+ properties: {
55
+ text: {
56
+ type: string;
57
+ contentType: string;
58
+ };
59
+ textSize: {
60
+ type: string;
61
+ enum: string[];
62
+ };
63
+ url: {
64
+ type: string;
65
+ };
66
+ urlTitle: {
67
+ type: string;
68
+ };
69
+ resetMargin: {
70
+ type: string;
71
+ };
72
+ };
73
+ })[];
74
+ };
75
+ description: {
76
+ type: string;
77
+ contentType: string;
78
+ inputType: string;
79
+ };
80
+ type: {};
81
+ when: {
82
+ type: string;
83
+ };
84
+ };
85
+ };
86
+ };
@@ -0,0 +1,44 @@
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(Object.assign({}, common_1.BaseProps), common_1.BlockHeaderProps), { date: {
10
+ oneOf: [
11
+ {
12
+ type: 'string',
13
+ enum: ['today', 'week', 'month'],
14
+ },
15
+ {
16
+ type: 'object',
17
+ additionalProperties: false,
18
+ required: [],
19
+ properties: {
20
+ start: {
21
+ type: 'string',
22
+ },
23
+ end: {
24
+ type: 'string',
25
+ },
26
+ },
27
+ optionName: 'options',
28
+ },
29
+ ],
30
+ }, tags: {
31
+ type: 'array',
32
+ items: {
33
+ type: 'string',
34
+ },
35
+ }, services: {
36
+ type: 'array',
37
+ items: {
38
+ type: 'string',
39
+ },
40
+ }, pinnedPost: {
41
+ type: 'boolean',
42
+ } }),
43
+ },
44
+ };
@@ -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, description, date, tags, services, pinnedPost, }: import("./models").RelevantPostsBlockProps) => JSX.Element;
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,20 @@
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
+ posts: RelevantPostData[];
19
+ }
20
+ 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,17 @@ export interface BlogFeedBlockProps {
307
308
  image?: string;
308
309
  title?: string;
309
310
  }
311
+ export interface RelevantPostsBlockProps {
312
+ title?: TitleItemProps | string;
313
+ description?: string;
314
+ date?: {
315
+ start?: string;
316
+ end?: string;
317
+ } | 'today' | 'week' | 'month';
318
+ tags?: string[];
319
+ services?: string[];
320
+ pinnedPost?: boolean;
321
+ }
310
322
  export interface PressReleasesBlockProps {
311
323
  title?: string;
312
324
  }
@@ -528,13 +540,16 @@ export type EventsFeedBlockModel = {
528
540
  export type BlogFeedBlockModel = {
529
541
  type: BlockType.BlogFeedBlock;
530
542
  } & BlogFeedBlockProps;
543
+ export type RelevantPostsBlockModel = {
544
+ type: BlockType.RelevantPostsBlock;
545
+ } & RelevantPostsBlockProps;
531
546
  export type PressReleasesBlockModel = {
532
547
  type: BlockType.PressReleasesBlock;
533
548
  } & PressReleasesBlockProps;
534
549
  export type SliderNewBlockModel = {
535
550
  type: BlockType.SliderNewBlock;
536
551
  } & 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;
552
+ 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
553
  type UnstableBlockModels = SliderNewBlockModel;
539
554
  export type Block = (BlockModels | UnstableBlockModels) & BlockBaseProps;
540
555
  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, description, date, tags, services, pinnedPost, }: RelevantPostsBlockProps) => JSX.Element;
4
+ export default RelevantPosts;
@@ -0,0 +1,72 @@
1
+ import React, { useContext, useEffect, 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, description, date, tags, services, pinnedPost, }) => {
15
+ const [now, setNow] = React.useState(null);
16
+ const { posts } = useContext(RelevantPostsContext);
17
+ useEffect(() => {
18
+ setNow(new Date());
19
+ }, []);
20
+ const filteredPosts = useMemo(() => {
21
+ if (!now)
22
+ return [];
23
+ return posts.filter((item) => {
24
+ var _a, _b;
25
+ const itemDate = new Date(item.dateTime);
26
+ let isDateMatch = true;
27
+ if (date === 'today') {
28
+ const startOfToday = new Date(now);
29
+ startOfToday.setHours(0, 0, 0, 0);
30
+ const endOfToday = new Date(now);
31
+ endOfToday.setHours(23, 59, 59, 999);
32
+ isDateMatch = itemDate >= startOfToday && itemDate <= endOfToday;
33
+ }
34
+ else if (date === 'week') {
35
+ const weekAgo = new Date(now);
36
+ weekAgo.setDate(now.getDate() - 7);
37
+ isDateMatch = itemDate >= weekAgo && itemDate <= now;
38
+ }
39
+ else if (date === 'month') {
40
+ const monthAgo = new Date(now);
41
+ monthAgo.setMonth(now.getMonth() - 1);
42
+ isDateMatch = itemDate >= monthAgo && itemDate <= now;
43
+ }
44
+ else if (typeof date === 'object' && (date.start || date.end)) {
45
+ const startDate = date.start ? new Date(date.start) : new Date('1970-01-01');
46
+ const endDate = date.end ? new Date(date.end) : now;
47
+ isDateMatch = itemDate >= startDate && itemDate <= endDate;
48
+ }
49
+ // Фильтрация по тегам
50
+ const isTagMatch = !tags || tags.length === 0 || ((_a = item.tags) === null || _a === void 0 ? void 0 : _a.some((tag) => tags.includes(tag.slug)));
51
+ // Фильтрация по сервисам
52
+ const isServiceMatch = !services ||
53
+ services.length === 0 ||
54
+ ((_b = item.services) === null || _b === void 0 ? void 0 : _b.some((s) => services.includes(s)));
55
+ return isDateMatch && isTagMatch && isServiceMatch;
56
+ });
57
+ }, [now, posts, date, tags, services]);
58
+ const [findedPinnedPost, restPosts] = useMemo(() => {
59
+ if (!pinnedPost || filteredPosts.length === 0)
60
+ return [undefined, filteredPosts];
61
+ const postsCopy = [...filteredPosts];
62
+ const pinned = postsCopy.pop(); // безопасно
63
+ return [pinned, postsCopy];
64
+ }, [filteredPosts, pinnedPost]);
65
+ return (React.createElement("div", { className: b() },
66
+ (title || description) && React.createElement(Title, { title: title, subtitle: description }),
67
+ findedPinnedPost && (React.createElement("div", { className: b('pinned') },
68
+ React.createElement(PostCard, Object.assign({}, findedPinnedPost, { size: PostCardSize.MEDIUM, fullWidth: true, showTag: true })))),
69
+ restPosts.length > 0 && (React.createElement("div", { className: b('slider') },
70
+ React.createElement(SliderBlock, { slidesToShow: colSizes }, restPosts.map((item) => (React.createElement(PostCard, Object.assign({ key: item.slug }, item, { showTag: true })))))))));
71
+ };
72
+ export default RelevantPosts;
@@ -0,0 +1,86 @@
1
+ export declare const RelevantPostsBlock: {
2
+ 'relevant-posts-block': {
3
+ additionalProperties: boolean;
4
+ required: never[];
5
+ properties: {
6
+ date: {
7
+ oneOf: ({
8
+ type: string;
9
+ enum: string[];
10
+ additionalProperties?: undefined;
11
+ required?: undefined;
12
+ properties?: undefined;
13
+ optionName?: undefined;
14
+ } | {
15
+ type: string;
16
+ additionalProperties: boolean;
17
+ required: never[];
18
+ properties: {
19
+ start: {
20
+ type: string;
21
+ };
22
+ end: {
23
+ type: string;
24
+ };
25
+ };
26
+ optionName: string;
27
+ enum?: undefined;
28
+ })[];
29
+ };
30
+ tags: {
31
+ type: string;
32
+ items: {
33
+ type: string;
34
+ };
35
+ };
36
+ services: {
37
+ type: string;
38
+ items: {
39
+ type: string;
40
+ };
41
+ };
42
+ pinnedPost: {
43
+ type: string;
44
+ };
45
+ title: {
46
+ oneOf: ({
47
+ type: string;
48
+ optionName: string;
49
+ } | {
50
+ optionName: string;
51
+ type: string;
52
+ additionalProperties: boolean;
53
+ required: string[];
54
+ properties: {
55
+ text: {
56
+ type: string;
57
+ contentType: string;
58
+ };
59
+ textSize: {
60
+ type: string;
61
+ enum: string[];
62
+ };
63
+ url: {
64
+ type: string;
65
+ };
66
+ urlTitle: {
67
+ type: string;
68
+ };
69
+ resetMargin: {
70
+ type: string;
71
+ };
72
+ };
73
+ })[];
74
+ };
75
+ description: {
76
+ type: string;
77
+ contentType: string;
78
+ inputType: string;
79
+ };
80
+ type: {};
81
+ when: {
82
+ type: string;
83
+ };
84
+ };
85
+ };
86
+ };
@@ -0,0 +1,41 @@
1
+ import { BaseProps, BlockHeaderProps } from './../../schema/validators/common';
2
+ export const RelevantPostsBlock = {
3
+ 'relevant-posts-block': {
4
+ additionalProperties: false,
5
+ required: [],
6
+ properties: Object.assign(Object.assign(Object.assign({}, BaseProps), BlockHeaderProps), { date: {
7
+ oneOf: [
8
+ {
9
+ type: 'string',
10
+ enum: ['today', 'week', 'month'],
11
+ },
12
+ {
13
+ type: 'object',
14
+ additionalProperties: false,
15
+ required: [],
16
+ properties: {
17
+ start: {
18
+ type: 'string',
19
+ },
20
+ end: {
21
+ type: 'string',
22
+ },
23
+ },
24
+ optionName: 'options',
25
+ },
26
+ ],
27
+ }, tags: {
28
+ type: 'array',
29
+ items: {
30
+ type: 'string',
31
+ },
32
+ }, services: {
33
+ type: 'array',
34
+ items: {
35
+ type: 'string',
36
+ },
37
+ }, pinnedPost: {
38
+ type: 'boolean',
39
+ } }),
40
+ },
41
+ };