-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathDefaultBody.jsx
More file actions
135 lines (128 loc) · 4.14 KB
/
Copy pathDefaultBody.jsx
File metadata and controls
135 lines (128 loc) · 4.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import React from 'react';
import { useIntl, defineMessages } from 'react-intl';
import { Icon, MaybeWrap, UniversalLink } from '@plone/volto/components';
import { Input, Button, Message } from 'semantic-ui-react';
import { isInternalURL } from '@plone/volto/helpers';
import cx from 'classnames';
import navTreeSVG from '@plone/volto/icons/nav.svg';
import imageBlockSVG from '@plone/volto/components/manage/Blocks/Image/block-image.svg';
import config from '@plone/volto/registry';
const messages = defineMessages({
PleaseChooseContent: {
id: 'Please choose an existing content as target for this element or select a custom image',
defaultMessage:
'Please choose an existing content as target for this element or select a custom image',
},
moreInfo: {
id: 'moreInfo',
defaultMessage: 'More info',
},
selectTarget: {
id: 'Select target',
defaultMessage: 'Select target',
},
});
const DefaultImage = (props) => <img {...props} alt={props.alt || ''} />;
const SliderBody = ({
index,
onChangeBlock,
block,
data,
dataBlock,
isEditMode,
openObjectBrowser,
isActive,
}) => {
const intl = useIntl();
const href = data.href?.[0];
const image = data.preview_image?.[0];
const Image = config.getComponent('Image').component || DefaultImage;
const { openExternalLinkInNewTab } = config.settings;
const handleClick = () => {
openObjectBrowser({
onSelectItem: (url, document) => {
dataBlock.slides[index].title = document.Title;
dataBlock.slides[index].description = document.Description;
dataBlock.slides[index].href = [
{
'@id': document['@id'],
Title: document.Title,
Description: document.Description,
title: document.Title,
image_field: document.image_field,
hasPreviewImage: document.hasPreviewImage,
},
];
onChangeBlock(block, dataBlock);
},
mode: 'link',
});
};
return (
<div
className={cx('grid-teaser-item top', {
'empty-slide': !href && !image && isEditMode,
'slide-visible': isActive,
})}
>
{!href && !image && isEditMode && (
<Message>
<div className="grid-teaser-item default">
<img src={imageBlockSVG} alt="" />
<p>{intl.formatMessage(messages.PleaseChooseContent)}</p>
<div className="toolbar-inner">
<Button.Group>
<Button onClick={handleClick} icon basic>
<Icon name={navTreeSVG} size="24px" />
</Button>
</Button.Group>
<Input
placeholder={intl.formatMessage(messages.selectTarget)}
onClick={handleClick}
onFocus={(e) => e.target.blur()}
/>
</div>
</div>
</Message>
)}
{(href || image) && (
<div className="teaser-item top">
<MaybeWrap
condition={!isEditMode && href}
as={UniversalLink}
href={href?.['@id']}
target={
data.openLinkInNewTab ||
(openExternalLinkInNewTab && !isInternalURL(href['@id']))
? '_blank'
: null
}
tabIndex={!isActive ? '-1' : null}
>
{(href?.hasPreviewImage || href?.image_field || image) && (
<div className="highlight-image-wrapper gradient">
<Image
item={image || href}
imageField={image ? image.image_field : href.image_field}
alt=""
loading="lazy"
responsive={true}
/>
</div>
)}
<div className="teaser-item-title fix-width-issue">
<div className="title">
{data?.head_title && (
<span className="supertitle">{data?.head_title}</span>
)}
<h2>{data?.nav_title || data?.title}</h2>
</div>
<p>{data?.description}</p>
</div>
</MaybeWrap>
</div>
)}
</div>
);
};
export default SliderBody;