PluginProbe ʕ •ᴥ•ʔ
VK Blocks / trunk
VK Blocks vtrunk
1.123.0 1.122.0 1.121.0 1.120.0 1.119.2 1.119.1 1.119.0 1.118.7 1.82.0.0 1.82.0.1 1.83.0.0 1.83.0.1 1.84.0.0 1.84.0.1 1.85.0.2 1.85.0.3 1.85.1.0 1.85.1.1 1.86.0.0 1.86.0.1 1.86.1.0 1.87.0.0 1.87.0.1 1.88.0.1 1.88.0.2 1.89.0.0 1.9.2 1.90.0.0 1.90.0.1 1.90.1.1 1.91.0.0 1.91.1.1 1.92.0.0 1.92.0.1 1.92.1.0 1.92.1.1 1.93.0.0 trunk 1.93.0.1 0.1.1 1.93.1.0 0.10.3 1.93.1.1 0.11.0 1.94.0.0 0.12.6 1.94.0.1 0.15.1 1.94.1.0 0.16.2 1.94.2.1 0.17.6 1.94.2.2 0.2.2 1.95.0.3 0.22.4 1.95.0.4 0.26.7 1.96.2.0 0.3.2 1.96.2.1 0.31.0 1.97.0.1 0.35.5 1.97.0.2 0.37.5 1.99.0.0 0.38.8 1.99.0.1 0.39.4 0.4.7 0.41.0 0.42.0 0.44.13 0.45.2 0.46.1 0.47.0 0.48.0 0.49.8 0.5.2 0.50.3 0.51.0 0.52.2 0.53.2 0.54.0 0.55.0 0.56.2 0.56.3 0.57.6 0.58.10 0.59.0 0.6.0 0.60.1 0.61.2 0.7.1 0.8.2 1.0.16 1.10.0 1.100.0.0 1.100.0.1 1.102.0.0 1.102.0.1 1.103.0.0 1.104.0.0 1.104.0.1 1.105.1.0 1.105.1.1 1.106.0.0 1.106.0.1 1.107.0.0 1.107.0.1 1.107.0.2 1.108.0.0 1.108.0.1 1.109.0.0 1.109.0.1 1.11.4 1.110.0.0 1.110.0.1 1.111.0.0 1.111.0.1 1.111.0.2 1.112.0.0 1.112.0.1 1.113.0.0 1.113.0.1 1.114.0.0 1.114.0.1 1.114.2.0 1.114.2.1 1.115.0.0 1.115.0.1 1.115.1.0 1.115.1.1 1.115.2.0 1.115.2.1 1.116.0.0 1.116.0.1 1.116.1.0 1.116.1.1 1.116.2.0 1.117.0.0 1.117.0.1 1.117.1.0 1.118.2 1.118.5 1.12.0 1.13.2 1.14.1 1.15.1 1.16.11 1.17.0 1.18.6 1.19.0 1.19.1 1.2.3 1.20.7 1.21.0 1.22.4 1.23.0 1.24.5 1.25.1 1.26.2 1.27.7.2 1.28.0.1 1.29.2.0 1.3.9 1.30.0.1 1.31.0.1 1.32.0.2 1.33.2.1 1.36.1.5 1.37.0.0 1.39.2.1 1.4.6 1.40.0.1 1.40.1.0 1.40.1.1 1.41.0.0 1.41.0.1 1.41.2.2 1.41.2.3 1.43.0.0 1.43.0.1 1.43.0.2 1.44.0.0 1.44.0.1 1.45.0.0 1.45.0.1 1.46.0.0 1.46.0.1 1.47.0.0 1.47.0.1 1.47.1.0 1.48.0.0 1.48.0.1 1.48.0.2 1.48.1.0 1.48.1.1 1.5.0 1.50.0.0 1.50.0.1 1.51.0.0 1.51.0.1 1.52.0.0 1.52.0.1 1.53.0.0 1.53.0.1 1.54.0.0 1.54.0.1 1.55.0.0 1.55.0.1 1.56.0.0 1.56.0.1 1.57.0.0 1.57.0.2 1.57.0.3 1.57.0.4 1.57.0.5 1.57.1.0 1.57.1.1 1.57.1.2 1.58.0.0 1.58.0.1 1.59.0.0 1.59.0.1 1.6.0 1.60.0.0 1.60.0.1 1.63.0.0 1.63.0.1 1.64.0.0 1.64.0.1 1.64.1.0 1.64.1.2 1.67.0.0 1.67.0.1 1.68.0.0 1.68.0.1 1.69.0.0 1.69.0.1 1.69.1.1 1.69.1.2 1.7.1 1.70.0.0 1.70.0.1 1.71.0.0 1.71.0.1 1.72.0.0 1.72.1.0 1.72.1.1 1.73.0.0 1.73.0.1 1.74.0.0 1.74.0.1 1.75.0.0 1.75.1.0 1.75.1.1 1.76.0.0 1.76.0.1 1.76.1.0 1.76.1.1 1.76.2.0 1.76.2.1 1.77.0.0 1.77.0.1 1.78.0.0 1.78.0.1 1.79.0.0 1.79.0.1 1.79.0.2 1.79.0.3 1.79.1.0 1.79.1.1 1.8.2 1.80.1.0 1.80.1.1 1.80.1.2 1.81.0.1 1.81.0.2
vk-blocks / src / blocks / slider-item / edit.js
vk-blocks / src / blocks / slider-item Last commit date
deprecated 2 months ago GenerateBgImage.js 2 months ago block.json 1 month ago edit.js 1 week ago icon.svg 2 months ago index.js 2 months ago index.php 2 months ago save.js 2 months ago style.scss 2 months ago
edit.js
345 lines
1 /**
2 * External dependencies
3 */
4 import classnames from 'classnames';
5
6 /* eslint camelcase: 0 */
7 import { __ } from '@wordpress/i18n';
8 import { useEffect } from '@wordpress/element';
9 import { select } from '@wordpress/data';
10 import {
11 InspectorControls,
12 BlockControls,
13 BlockVerticalAlignmentToolbar,
14 InnerBlocks,
15 useBlockProps,
16 } from '@wordpress/block-editor';
17 import {
18 RangeControl,
19 RadioControl,
20 PanelBody,
21 BaseControl,
22 ToolbarGroup,
23 ToggleControl,
24 } from '@wordpress/components';
25 import { AdvancedMediaUpload } from '@vkblocks/components/advanced-media-upload';
26 import BackgroundImageToolbar from '@vkblocks/components/background-image-toolbar';
27 import GenerateBgImage from './GenerateBgImage';
28 import { isHexColor } from '@vkblocks/utils/is-hex-color';
29 import { AdvancedColorPalette } from '@vkblocks/components/advanced-color-palette';
30 import {
31 isParentReusableBlock,
32 hasBlockIdCollision,
33 shouldUpdateBlockId,
34 } from '@vkblocks/utils/is-parent-reusable-block';
35 import LinkToolbar from '@vkblocks/components/link-toolbar';
36 import { sanitizeSlug } from '@vkblocks/utils/sanitizeSlug';
37 import { toPresetSpacingVar } from '@vkblocks/utils/to-preset-spacing-var';
38
39 const prefix = 'vk_slider_item';
40
41 export default function SliderItemEdit(props) {
42 const { attributes, setAttributes, clientId } = props;
43 const {
44 verticalAlignment,
45 bgColor,
46 opacity,
47 bgSize,
48 bgImageMobile,
49 bgImageTablet,
50 bgImage,
51 linkUrl,
52 linkTarget,
53 relAttribute,
54 linkDescription,
55 contentWidth,
56 blockId,
57 } = attributes;
58
59 useEffect(() => {
60 if (attributes.clientId !== undefined) {
61 setAttributes({ clientId: undefined });
62 }
63 // issue #2556: blockId を毎リロードで上書きすると dirty 化するため、
64 // 「未確定」または「再利用ブロック外での実衝突(複製)」のときだけ再採番する。
65 if (
66 shouldUpdateBlockId({
67 blockId,
68 isInReusableBlock: isParentReusableBlock(clientId),
69 hasCollision: hasBlockIdCollision(clientId, blockId),
70 })
71 ) {
72 setAttributes({ blockId: clientId });
73 }
74 }, [clientId]);
75
76 // 既存ブロックの bgImage, bgImageTablet, bgImageMobile の ID を自動補完
77 useEffect(() => {
78 let isMounted = true;
79
80 const updateBgImageId = async (imageUrl, idAttributeName) => {
81 if (!imageUrl || attributes[idAttributeName]) {
82 return;
83 }
84
85 for (let attempts = 0; attempts < 10 && isMounted; attempts++) {
86 const media = select('core').getEntityRecords(
87 'postType',
88 'attachment',
89 { per_page: -1 }
90 );
91 const mediaItem = media?.find(
92 (item) => item.source_url === imageUrl
93 );
94
95 if (mediaItem?.id) {
96 setAttributes({ [idAttributeName]: mediaItem.id });
97 return;
98 }
99
100 await new Promise((resolve) => setTimeout(resolve, 500));
101 }
102 };
103
104 ['bgImage', 'bgImageTablet', 'bgImageMobile'].forEach((attr) =>
105 updateBgImageId(attributes[attr], `${attr}Id`)
106 );
107
108 return () => {
109 isMounted = false;
110 };
111 }, [
112 attributes.bgImage,
113 attributes.bgImageTablet,
114 attributes.bgImageMobile,
115 ]);
116
117 const spacingPaddingLeft = attributes?.style?.spacing?.padding?.left;
118 const spacingPaddingRight = attributes?.style?.spacing?.padding?.right;
119 const spacingPaddingLeftVar = toPresetSpacingVar(spacingPaddingLeft);
120 const spacingPaddingRightVar = toPresetSpacingVar(spacingPaddingRight);
121
122 let classPaddingLR = '';
123 if (contentWidth) {
124 classPaddingLR += `is-layout-constrained`;
125 }
126 if (!spacingPaddingLeft && !spacingPaddingRight) {
127 classPaddingLR += ` ${prefix}-paddingLR-use`;
128 }
129
130 let containerClass = '';
131 if (contentWidth) {
132 containerClass = `${prefix}_container container`;
133 } else {
134 containerClass = `${prefix}_container`;
135 }
136
137 const opacityClass = opacity && opacity * 10;
138 const bgAreaClasses = classnames('vk_slider_item-background-area', {
139 [`has-background`]: bgColor !== undefined,
140 [`has-${sanitizeSlug(bgColor)}-background-color`]:
141 bgColor !== undefined && !isHexColor(bgColor),
142 [`has-background-dim`]: opacity !== undefined,
143 [`has-background-dim-${opacityClass}`]: opacityClass !== undefined,
144 });
145
146 const bgAreaStyles = {
147 backgroundColor: isHexColor(bgColor) ? bgColor : undefined,
148 paddingLeft: spacingPaddingLeftVar,
149 paddingRight: spacingPaddingRightVar,
150 };
151
152 const GetBgImage = (
153 <>
154 {(bgImage || bgImageTablet || bgImageMobile) && (
155 <GenerateBgImage prefix={prefix} blockId={blockId} {...props} />
156 )}
157 <div className={bgAreaClasses} style={bgAreaStyles}></div>
158 </>
159 );
160
161 const blockProps = useBlockProps({
162 className: `vk_slider_item vk_valign-${verticalAlignment} ${prefix}-${blockId} ${classPaddingLR} ${prefix}-paddingVertical-none swiper-slide`,
163 style: {
164 paddingLeft: spacingPaddingLeftVar,
165 paddingRight: spacingPaddingRightVar,
166 },
167 });
168
169 return (
170 <>
171 <BlockControls>
172 <BlockVerticalAlignmentToolbar
173 onChange={(alignment) =>
174 setAttributes({ verticalAlignment: alignment })
175 }
176 value={verticalAlignment}
177 />
178 <BackgroundImageToolbar
179 sidebarClass={'vk_slider_item_sidebar_bgImage'}
180 {...props}
181 />
182 <ToolbarGroup>
183 <LinkToolbar
184 linkUrl={linkUrl}
185 setLinkUrl={(url) => setAttributes({ linkUrl: url })}
186 linkTarget={linkTarget}
187 setLinkTarget={(target) =>
188 setAttributes({ linkTarget: target })
189 }
190 relAttribute={relAttribute}
191 setRelAttribute={(rel) =>
192 setAttributes({ relAttribute: rel })
193 }
194 linkDescription={linkDescription}
195 setLinkDescription={(description) =>
196 setAttributes({ linkDescription: description })
197 }
198 />
199 </ToolbarGroup>
200 </BlockControls>
201 <InspectorControls>
202 <PanelBody
203 title={__('Layout Setting', 'vk-blocks')}
204 initialOpen={true}
205 >
206 <BaseControl
207 label={__('Vertical align', 'vk-blocks')}
208 id={`vk_sliderItem-verticalAlign`}
209 >
210 <BlockVerticalAlignmentToolbar
211 onChange={(alignment) =>
212 setAttributes({
213 verticalAlignment: alignment,
214 })
215 }
216 value={verticalAlignment}
217 />
218 </BaseControl>
219 <BaseControl
220 label={__('Content Area Width', 'vk-blocks')}
221 id={`vk_slider-effect`}
222 >
223 <ToggleControl
224 label={__(
225 'Use content width for inner blocks.',
226 'vk-blocks'
227 )}
228 checked={contentWidth}
229 onChange={(checked) =>
230 setAttributes({ contentWidth: checked })
231 }
232 help={__(
233 'Nested blocks should inherit the content width.',
234 'vk-blocks'
235 )}
236 />
237 </BaseControl>
238 </PanelBody>
239 <PanelBody
240 title={__('Background Setting', 'vk-blocks')}
241 initialOpen={false}
242 >
243 <BaseControl
244 label={__('Color Setting', 'vk-blocks')}
245 id={`vk_sliderItem-colorSetting`}
246 help={__(
247 'Color will overcome background image. If you want to display image, set opacity 0.',
248 'vk-blocks'
249 )}
250 >
251 <AdvancedColorPalette
252 enableAlpha={false}
253 schema={'bgColor'}
254 {...props}
255 />
256 </BaseControl>
257 <BaseControl
258 label={__('Opacity Setting', 'vk-blocks')}
259 id={`vk_sliderItem-opacitySetting`}
260 >
261 <RangeControl
262 value={opacity}
263 onChange={(value) => {
264 setAttributes({ opacity: value });
265 }}
266 min={0}
267 max={1}
268 step={0.1}
269 />
270 </BaseControl>
271 <BaseControl
272 label={__('Background Image Size', 'vk-blocks')}
273 id={`vk_sliderItem-backgroundImageSize`}
274 >
275 <RadioControl
276 selected={bgSize}
277 options={[
278 {
279 label: __('cover', 'vk-blocks'),
280 value: 'cover',
281 },
282 {
283 label: __('repeat', 'vk-blocks'),
284 value: 'repeat',
285 },
286 ]}
287 onChange={(value) =>
288 setAttributes({ bgSize: value })
289 }
290 />
291 </BaseControl>
292 <BaseControl
293 label={__('Background Image PC', 'vk-blocks')}
294 id={`vk_sliderItem-backgroundImagePC`}
295 className={'vk_slider_item_sidebar_bgImage'}
296 >
297 <div
298 className={
299 'vk_slider_item_sidebar_bgImage_button_container'
300 }
301 >
302 <AdvancedMediaUpload
303 schema={'bgImage'}
304 schemaId={'bgImageId'}
305 {...props}
306 />
307 </div>
308 </BaseControl>
309 <BaseControl
310 label={__('Background Image Tablet', 'vk-blocks')}
311 className={'vk_slider_item_sidebar_bgImage'}
312 id={`vk_sliderItem-backgroundImageTablet`}
313 >
314 <AdvancedMediaUpload
315 schema={'bgImageTablet'}
316 schemaId={'bgImageTabletId'}
317 {...props}
318 />
319 </BaseControl>
320 <BaseControl
321 label={__('Background Image Mobile', 'vk-blocks')}
322 className={'vk_slider_item_sidebar_bgImage'}
323 id={`vk_sliderItem-backgroundImageMobile`}
324 >
325 <AdvancedMediaUpload
326 schema={'bgImageMobile'}
327 schemaId={'bgImageMobileId'}
328 {...props}
329 />
330 </BaseControl>
331 </PanelBody>
332 </InspectorControls>
333 <div {...blockProps}>
334 {GetBgImage}
335 <div className={containerClass}>
336 <InnerBlocks
337 templateLock={false}
338 template={[['core/paragraph']]}
339 />
340 </div>
341 </div>
342 </>
343 );
344 }
345