@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.
- package/build/cjs/blocks/BlogFeed/BlogFeedPosts/BlogFeedPosts.css +0 -1
- package/build/cjs/blocks/RelevantPosts/RelevantPosts.css +8 -0
- package/build/cjs/blocks/RelevantPosts/RelevantPosts.d.ts +3 -0
- package/build/cjs/blocks/RelevantPosts/RelevantPosts.js +76 -0
- package/build/cjs/blocks/RelevantPosts/schema.d.ts +86 -0
- package/build/cjs/blocks/RelevantPosts/schema.js +44 -0
- package/build/cjs/blocks/index.d.ts +1 -0
- package/build/cjs/blocks/index.js +3 -1
- package/build/cjs/constructor-items.d.ts +1 -0
- package/build/cjs/constructor-items.js +1 -0
- package/build/cjs/context/relevantPostsContext/RelevantPostsContext.d.ts +20 -0
- package/build/cjs/context/relevantPostsContext/RelevantPostsContext.js +8 -0
- package/build/cjs/context/relevantPostsContext/index.d.ts +1 -0
- package/build/cjs/context/relevantPostsContext/index.js +4 -0
- package/build/cjs/index.d.ts +1 -0
- package/build/cjs/index.js +1 -0
- package/build/cjs/models/constructor-items/blocks.d.ts +16 -1
- package/build/cjs/models/constructor-items/blocks.js +1 -0
- package/build/cjs/schema/constants.js +2 -1
- package/build/cjs/schema/validators/blocks.d.ts +1 -0
- package/build/cjs/schema/validators/blocks.js +1 -0
- package/build/esm/blocks/BlogFeed/BlogFeedPosts/BlogFeedPosts.css +0 -1
- package/build/esm/blocks/RelevantPosts/RelevantPosts.css +8 -0
- package/build/esm/blocks/RelevantPosts/RelevantPosts.d.ts +4 -0
- package/build/esm/blocks/RelevantPosts/RelevantPosts.js +72 -0
- package/build/esm/blocks/RelevantPosts/schema.d.ts +86 -0
- package/build/esm/blocks/RelevantPosts/schema.js +41 -0
- package/build/esm/blocks/index.d.ts +1 -0
- package/build/esm/blocks/index.js +1 -0
- package/build/esm/constructor-items.d.ts +1 -0
- package/build/esm/constructor-items.js +2 -1
- package/build/esm/context/relevantPostsContext/RelevantPostsContext.d.ts +20 -0
- package/build/esm/context/relevantPostsContext/RelevantPostsContext.js +4 -0
- package/build/esm/context/relevantPostsContext/index.d.ts +1 -0
- package/build/esm/context/relevantPostsContext/index.js +1 -0
- package/build/esm/index.d.ts +1 -0
- package/build/esm/index.js +1 -0
- package/build/esm/models/constructor-items/blocks.d.ts +16 -1
- package/build/esm/models/constructor-items/blocks.js +1 -0
- package/build/esm/schema/constants.js +3 -2
- package/build/esm/schema/validators/blocks.d.ts +1 -0
- package/build/esm/schema/validators/blocks.js +1 -0
- package/package.json +1 -1
- package/schema/index.js +1 -1
- package/server/models/constructor-items/blocks.d.ts +16 -1
- package/server/models/constructor-items/blocks.js +1 -0
- package/widget/index.js +1 -1
|
@@ -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';
|
package/build/cjs/index.d.ts
CHANGED
|
@@ -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';
|
package/build/cjs/index.js
CHANGED
|
@@ -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);
|
|
@@ -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
|
+
};
|