@eeacms/volto-group-block 6.2.1 → 6.3.1
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/.husky/pre-commit +2 -0
- package/CHANGELOG.md +33 -0
- package/cypress.config.js +2 -2
- package/docker-compose.yml +5 -1
- package/locales/de/LC_MESSAGES/volto.po +8 -0
- package/locales/en/LC_MESSAGES/volto.po +22 -0
- package/locales/it/LC_MESSAGES/volto.po +8 -0
- package/locales/ro/LC_MESSAGES/volto.po +8 -0
- package/locales/volto.pot +9 -1
- package/package.json +26 -2
- package/src/components/index.js +4 -3
- package/src/components/manage/Blocks/Group/Body.jsx +17 -0
- package/src/components/manage/Blocks/Group/DefaultBody.jsx +105 -0
- package/src/components/manage/Blocks/Group/Edit.jsx +27 -96
- package/src/components/manage/Blocks/Group/Edit.test.jsx +19 -1
- package/src/components/manage/Blocks/Group/View.jsx +4 -4
- package/src/components/manage/Blocks/Group/View.test.jsx +12 -1
- package/src/index.js +14 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,39 @@ All notable changes to this project will be documented in this file. Dates are d
|
|
|
4
4
|
|
|
5
5
|
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
|
6
6
|
|
|
7
|
+
### [6.3.1](https://github.com/eea/volto-group-block/compare/6.3.0...6.3.1) - 18 September 2023
|
|
8
|
+
|
|
9
|
+
#### :bug: Bug Fixes
|
|
10
|
+
|
|
11
|
+
- fix: rendering of listing blocks inside defaultTemplate #257871 [nileshgulia1 - [`40ad609`](https://github.com/eea/volto-group-block/commit/40ad6093fb38acda35f7955795ec4cd90f11378c)]
|
|
12
|
+
|
|
13
|
+
#### :house: Internal changes
|
|
14
|
+
|
|
15
|
+
- style: lint-staged reorder in package.json [Alin Voinea - [`f29c1df`](https://github.com/eea/volto-group-block/commit/f29c1df1b8fce6d4a93db08ccc944f1ac8bc8b8b)]
|
|
16
|
+
|
|
17
|
+
#### :hammer_and_wrench: Others
|
|
18
|
+
|
|
19
|
+
- test: EN locales, pre-commit fix, feature PRs checks Refs #257193 [valentinab25 - [`2e9d601`](https://github.com/eea/volto-group-block/commit/2e9d60101dfe24420a126dbf360d0f32b6a1f9af)]
|
|
20
|
+
- test: Add cypress test for group block in DX Layout - refs #254894 [Crețu Mihaela - [`06d23ed`](https://github.com/eea/volto-group-block/commit/06d23ed82c959d6569ed57902b2e36bdc0fec970)]
|
|
21
|
+
### [6.3.0](https://github.com/eea/volto-group-block/compare/6.2.1...6.3.0) - 5 September 2023
|
|
22
|
+
|
|
23
|
+
#### :rocket: New Features
|
|
24
|
+
|
|
25
|
+
- feat(group): Variations support refs #157040 #26 from eea/variationsSupport [ichim-david - [`8342ae8`](https://github.com/eea/volto-group-block/commit/8342ae8d843bd672339f9472e1e806cbfeac8d1b)]
|
|
26
|
+
|
|
27
|
+
#### :bug: Bug Fixes
|
|
28
|
+
|
|
29
|
+
- fix: update and fix jest tests [nileshgulia1 - [`97df2cc`](https://github.com/eea/volto-group-block/commit/97df2cc6ac5c3283707ff72bb3d4cd762d5a3b2f)]
|
|
30
|
+
|
|
31
|
+
#### :hammer_and_wrench: Others
|
|
32
|
+
|
|
33
|
+
- Release #39 from eea/develop [ichim-david - [`283e1e8`](https://github.com/eea/volto-group-block/commit/283e1e8dd1047415bae054cfd502d1691deaeb59)]
|
|
34
|
+
- Release 6.3.0 [Alin Voinea - [`3d74bb5`](https://github.com/eea/volto-group-block/commit/3d74bb5342e3882e0ddee1aa8edab7e90949def6)]
|
|
35
|
+
- test: Fix eslint and yarn i18n [Alin Voinea - [`763f764`](https://github.com/eea/volto-group-block/commit/763f76448625e05b53a2bde86ca48dda0cb263cb)]
|
|
36
|
+
- i18n: Add en [Alin Voinea - [`f3385cd`](https://github.com/eea/volto-group-block/commit/f3385cd33bfbe3efe514fd82fd140d17e33051e1)]
|
|
37
|
+
- test: Update Makefile and docker-compose to align it with Jenkinsfile [valentinab25 - [`3aa996b`](https://github.com/eea/volto-group-block/commit/3aa996b4c115da6f37ca771f07f10d58fbfa33e8)]
|
|
38
|
+
- fix eslint warnings [nileshgulia1 - [`cfdf2e9`](https://github.com/eea/volto-group-block/commit/cfdf2e900bcc456fa5a24ce7b03859170ad024ba)]
|
|
39
|
+
- feature: add variations support [nileshgulia1 - [`d981c6b`](https://github.com/eea/volto-group-block/commit/d981c6b59c669712d60feb9cfb04022e228ac001)]
|
|
7
40
|
### [6.2.1](https://github.com/eea/volto-group-block/compare/6.2.0...6.2.1) - 18 August 2023
|
|
8
41
|
|
|
9
42
|
#### :bug: Bug Fixes
|
package/cypress.config.js
CHANGED
|
@@ -2,12 +2,12 @@ const { defineConfig } = require('cypress');
|
|
|
2
2
|
|
|
3
3
|
module.exports = defineConfig({
|
|
4
4
|
viewportWidth: 1280,
|
|
5
|
-
defaultCommandTimeout:
|
|
5
|
+
defaultCommandTimeout: 5000,
|
|
6
6
|
chromeWebSecurity: false,
|
|
7
7
|
reporter: 'junit',
|
|
8
8
|
video: true,
|
|
9
9
|
retries: {
|
|
10
|
-
runMode:
|
|
10
|
+
runMode: 1,
|
|
11
11
|
openMode: 0,
|
|
12
12
|
},
|
|
13
13
|
reporterOptions: {
|
package/docker-compose.yml
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
version: "3"
|
|
2
2
|
services:
|
|
3
3
|
backend:
|
|
4
|
-
image:
|
|
4
|
+
image: eeacms/plone-backend
|
|
5
5
|
ports:
|
|
6
6
|
- "8080:8080"
|
|
7
7
|
environment:
|
|
8
8
|
SITE: "Plone"
|
|
9
|
+
PROFILES: "eea.kitkat:testing"
|
|
9
10
|
|
|
10
11
|
frontend:
|
|
11
12
|
build:
|
|
@@ -23,6 +24,9 @@ services:
|
|
|
23
24
|
volumes:
|
|
24
25
|
- ./:/app/src/addons/${ADDON_PATH}
|
|
25
26
|
environment:
|
|
27
|
+
CI: "true"
|
|
28
|
+
NODE_ENV: "development"
|
|
29
|
+
RAZZLE_JEST_CONFIG: "src/addons/${ADDON_PATH}/jest-addon.config.js"
|
|
26
30
|
RAZZLE_INTERNAL_API_PATH: "http://backend:8080/Plone"
|
|
27
31
|
RAZZLE_DEV_PROXY_API_PATH: "http://backend:8080/Plone"
|
|
28
32
|
HOST: "0.0.0.0"
|
|
@@ -11,4 +11,12 @@ msgstr ""
|
|
|
11
11
|
"Content-Transfer-Encoding: \n"
|
|
12
12
|
"Plural-Forms: \n"
|
|
13
13
|
|
|
14
|
+
#: components/manage/Blocks/Group/EditBlockWrapper
|
|
15
|
+
# defaultMessage: Unknown Block {block}
|
|
16
|
+
msgid "Unknown Block"
|
|
17
|
+
msgstr ""
|
|
14
18
|
|
|
19
|
+
#: components/manage/Blocks/Group/EditBlockWrapper
|
|
20
|
+
# defaultMessage: delete
|
|
21
|
+
msgid "delete"
|
|
22
|
+
msgstr ""
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
msgid ""
|
|
2
|
+
msgstr ""
|
|
3
|
+
"Project-Id-Version: \n"
|
|
4
|
+
"Report-Msgid-Bugs-To: \n"
|
|
5
|
+
"POT-Creation-Date: \n"
|
|
6
|
+
"PO-Revision-Date: \n"
|
|
7
|
+
"Last-Translator: \n"
|
|
8
|
+
"Language: \n"
|
|
9
|
+
"Language-Team: \n"
|
|
10
|
+
"Content-Type: \n"
|
|
11
|
+
"Content-Transfer-Encoding: \n"
|
|
12
|
+
"Plural-Forms: \n"
|
|
13
|
+
|
|
14
|
+
#: components/manage/Blocks/Group/EditBlockWrapper
|
|
15
|
+
# defaultMessage: Unknown Block {block}
|
|
16
|
+
msgid "Unknown Block"
|
|
17
|
+
msgstr ""
|
|
18
|
+
|
|
19
|
+
#: components/manage/Blocks/Group/EditBlockWrapper
|
|
20
|
+
# defaultMessage: delete
|
|
21
|
+
msgid "delete"
|
|
22
|
+
msgstr ""
|
|
@@ -11,4 +11,12 @@ msgstr ""
|
|
|
11
11
|
"Content-Transfer-Encoding: \n"
|
|
12
12
|
"Plural-Forms: \n"
|
|
13
13
|
|
|
14
|
+
#: components/manage/Blocks/Group/EditBlockWrapper
|
|
15
|
+
# defaultMessage: Unknown Block {block}
|
|
16
|
+
msgid "Unknown Block"
|
|
17
|
+
msgstr ""
|
|
14
18
|
|
|
19
|
+
#: components/manage/Blocks/Group/EditBlockWrapper
|
|
20
|
+
# defaultMessage: delete
|
|
21
|
+
msgid "delete"
|
|
22
|
+
msgstr ""
|
|
@@ -11,4 +11,12 @@ msgstr ""
|
|
|
11
11
|
"Content-Transfer-Encoding: \n"
|
|
12
12
|
"Plural-Forms: \n"
|
|
13
13
|
|
|
14
|
+
#: components/manage/Blocks/Group/EditBlockWrapper
|
|
15
|
+
# defaultMessage: Unknown Block {block}
|
|
16
|
+
msgid "Unknown Block"
|
|
17
|
+
msgstr ""
|
|
14
18
|
|
|
19
|
+
#: components/manage/Blocks/Group/EditBlockWrapper
|
|
20
|
+
# defaultMessage: delete
|
|
21
|
+
msgid "delete"
|
|
22
|
+
msgstr ""
|
package/locales/volto.pot
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
msgid ""
|
|
2
2
|
msgstr ""
|
|
3
3
|
"Project-Id-Version: Plone\n"
|
|
4
|
-
"POT-Creation-Date: 2023-
|
|
4
|
+
"POT-Creation-Date: 2023-08-29T17:38:01.779Z\n"
|
|
5
5
|
"Last-Translator: Plone i18n <plone-i18n@lists.sourceforge.net>\n"
|
|
6
6
|
"Language-Team: Plone i18n <plone-i18n@lists.sourceforge.net>\n"
|
|
7
7
|
"MIME-Version: 1.0\n"
|
|
@@ -13,4 +13,12 @@ msgstr ""
|
|
|
13
13
|
"Preferred-Encodings: utf-8\n"
|
|
14
14
|
"Domain: volto\n"
|
|
15
15
|
|
|
16
|
+
#: components/manage/Blocks/Group/EditBlockWrapper
|
|
17
|
+
# defaultMessage: Unknown Block {block}
|
|
18
|
+
msgid "Unknown Block"
|
|
19
|
+
msgstr ""
|
|
16
20
|
|
|
21
|
+
#: components/manage/Blocks/Group/EditBlockWrapper
|
|
22
|
+
# defaultMessage: delete
|
|
23
|
+
msgid "delete"
|
|
24
|
+
msgstr ""
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eeacms/volto-group-block",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.3.1",
|
|
4
4
|
"description": "volto-group-block: Volto block to be used to group other blocks",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"author": "European Environment Agency: IDM2 A-Team",
|
|
@@ -22,8 +22,31 @@
|
|
|
22
22
|
"@cypress/code-coverage": "^3.10.0",
|
|
23
23
|
"@plone/scripts": "*",
|
|
24
24
|
"babel-plugin-transform-class-properties": "^6.24.1",
|
|
25
|
+
"husky": "*",
|
|
26
|
+
"lint-staged": "*",
|
|
25
27
|
"md5": "^2.3.0"
|
|
26
28
|
},
|
|
29
|
+
"lint-staged": {
|
|
30
|
+
"src/**/*.{js,jsx,ts,tsx,json}": [
|
|
31
|
+
"make lint-fix",
|
|
32
|
+
"make prettier-fix"
|
|
33
|
+
],
|
|
34
|
+
"src/**/*.{jsx}": [
|
|
35
|
+
"make i18n"
|
|
36
|
+
],
|
|
37
|
+
"theme/**/*.{css,less}": [
|
|
38
|
+
"make stylelint-fix"
|
|
39
|
+
],
|
|
40
|
+
"src/**/*.{css,less}": [
|
|
41
|
+
"make stylelint-fix"
|
|
42
|
+
],
|
|
43
|
+
"theme/**/*.overrides": [
|
|
44
|
+
"make stylelint-fix"
|
|
45
|
+
],
|
|
46
|
+
"src/**/*.overrides": [
|
|
47
|
+
"make stylelint-fix"
|
|
48
|
+
]
|
|
49
|
+
},
|
|
27
50
|
"scripts": {
|
|
28
51
|
"release": "release-it",
|
|
29
52
|
"release-major-beta": "release-it major --preRelease=beta",
|
|
@@ -41,6 +64,7 @@
|
|
|
41
64
|
"lint:fix": "make lint-fix",
|
|
42
65
|
"i18n": "make i18n",
|
|
43
66
|
"cypress:run": "make cypress-run",
|
|
44
|
-
"cypress:open": "make cypress-open"
|
|
67
|
+
"cypress:open": "make cypress-open",
|
|
68
|
+
"prepare": "husky install"
|
|
45
69
|
}
|
|
46
70
|
}
|
package/src/components/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
1
|
+
export { default as GroupBlockDefaultBody } from './manage/Blocks/Group/DefaultBody';
|
|
2
|
+
export { default as GroupBlockEdit } from './manage/Blocks/Group/Edit';
|
|
3
|
+
export { default as GroupBlockView } from './manage/Blocks/Group/View';
|
|
4
|
+
export { default as GroupBlockLayout } from './manage/Blocks/Group/LayoutSchema';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import { GroupBlockDefaultBody } from '@eeacms/volto-group-block/components';
|
|
4
|
+
|
|
5
|
+
const Body = (props) => {
|
|
6
|
+
const { variation } = props;
|
|
7
|
+
|
|
8
|
+
const BodyComponent = variation?.template || GroupBlockDefaultBody;
|
|
9
|
+
|
|
10
|
+
return <BodyComponent {...props} />;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
Body.propTypes = {
|
|
14
|
+
variation: PropTypes.objectOf(PropTypes.any).isRequired,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default Body;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { Button } from 'semantic-ui-react';
|
|
2
|
+
import { BlocksForm, Icon, RenderBlocks } from '@plone/volto/components';
|
|
3
|
+
import EditBlockWrapper from './EditBlockWrapper';
|
|
4
|
+
|
|
5
|
+
import helpSVG from '@plone/volto/icons/help.svg';
|
|
6
|
+
|
|
7
|
+
const GroupBlockDefaultBody = (props) => {
|
|
8
|
+
const {
|
|
9
|
+
block,
|
|
10
|
+
data,
|
|
11
|
+
onChangeBlock,
|
|
12
|
+
onChangeField,
|
|
13
|
+
pathname,
|
|
14
|
+
selected,
|
|
15
|
+
selectedBlock,
|
|
16
|
+
onSelectBlock,
|
|
17
|
+
setSelectedBlock,
|
|
18
|
+
manage,
|
|
19
|
+
childBlocksForm,
|
|
20
|
+
multiSelected,
|
|
21
|
+
formDescription,
|
|
22
|
+
isEditMode,
|
|
23
|
+
} = props;
|
|
24
|
+
const metadata = props.metadata || props.properties;
|
|
25
|
+
const blockState = {};
|
|
26
|
+
|
|
27
|
+
// Get editing instructions from block settings or props
|
|
28
|
+
let instructions = data?.instructions?.data || data?.instructions;
|
|
29
|
+
if (!instructions || instructions === '<p><br/></p>') {
|
|
30
|
+
instructions = formDescription;
|
|
31
|
+
}
|
|
32
|
+
return isEditMode ? (
|
|
33
|
+
<BlocksForm
|
|
34
|
+
metadata={metadata}
|
|
35
|
+
properties={childBlocksForm}
|
|
36
|
+
manage={manage}
|
|
37
|
+
selectedBlock={selected ? selectedBlock : null}
|
|
38
|
+
allowedBlocks={data.allowedBlocks}
|
|
39
|
+
title={data.placeholder}
|
|
40
|
+
description={instructions}
|
|
41
|
+
onSelectBlock={(id, l, e) => {
|
|
42
|
+
const isMultipleSelection = e
|
|
43
|
+
? e.shiftKey || e.ctrlKey || e.metaKey
|
|
44
|
+
: false;
|
|
45
|
+
onSelectBlock(id, isMultipleSelection, e, selectedBlock);
|
|
46
|
+
}}
|
|
47
|
+
onChangeFormData={(newFormData) => {
|
|
48
|
+
onChangeBlock(block, {
|
|
49
|
+
...data,
|
|
50
|
+
data: newFormData,
|
|
51
|
+
});
|
|
52
|
+
}}
|
|
53
|
+
onChangeField={(id, value) => {
|
|
54
|
+
if (['blocks', 'blocks_layout'].indexOf(id) > -1) {
|
|
55
|
+
blockState[id] = value;
|
|
56
|
+
onChangeBlock(block, {
|
|
57
|
+
...data,
|
|
58
|
+
data: {
|
|
59
|
+
...data.data,
|
|
60
|
+
...blockState,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
} else {
|
|
64
|
+
onChangeField(id, value);
|
|
65
|
+
}
|
|
66
|
+
}}
|
|
67
|
+
pathname={pathname}
|
|
68
|
+
>
|
|
69
|
+
{({ draginfo }, editBlock, blockProps) => (
|
|
70
|
+
<EditBlockWrapper
|
|
71
|
+
draginfo={draginfo}
|
|
72
|
+
blockProps={blockProps}
|
|
73
|
+
disabled={data.disableInnerButtons}
|
|
74
|
+
extraControls={
|
|
75
|
+
<>
|
|
76
|
+
{instructions && (
|
|
77
|
+
<>
|
|
78
|
+
<Button
|
|
79
|
+
icon
|
|
80
|
+
basic
|
|
81
|
+
title="Section help"
|
|
82
|
+
onClick={() => {
|
|
83
|
+
setSelectedBlock();
|
|
84
|
+
const tab = manage ? 0 : 1;
|
|
85
|
+
props.setSidebarTab(tab);
|
|
86
|
+
}}
|
|
87
|
+
>
|
|
88
|
+
<Icon name={helpSVG} className="" size="19px" />
|
|
89
|
+
</Button>
|
|
90
|
+
</>
|
|
91
|
+
)}
|
|
92
|
+
</>
|
|
93
|
+
}
|
|
94
|
+
multiSelected={multiSelected.includes(blockProps.block)}
|
|
95
|
+
>
|
|
96
|
+
{editBlock}
|
|
97
|
+
</EditBlockWrapper>
|
|
98
|
+
)}
|
|
99
|
+
</BlocksForm>
|
|
100
|
+
) : (
|
|
101
|
+
<RenderBlocks metadata={metadata} content={data?.data || {}} />
|
|
102
|
+
);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export default GroupBlockDefaultBody;
|
|
@@ -1,46 +1,35 @@
|
|
|
1
1
|
import React, { useState, useCallback } from 'react';
|
|
2
2
|
import { isEmpty, without } from 'lodash';
|
|
3
|
+
import {
|
|
4
|
+
emptyBlocksForm,
|
|
5
|
+
withBlockExtensions,
|
|
6
|
+
getBlocksLayoutFieldname,
|
|
7
|
+
} from '@plone/volto/helpers';
|
|
8
|
+
import BodyComponent from './Body';
|
|
9
|
+
|
|
3
10
|
import config from '@plone/volto/registry';
|
|
4
11
|
import {
|
|
5
|
-
BlocksForm,
|
|
6
12
|
SidebarPortal,
|
|
7
|
-
Icon,
|
|
8
13
|
BlockDataForm,
|
|
9
14
|
BlocksToolbar,
|
|
10
15
|
} from '@plone/volto/components';
|
|
11
|
-
import {
|
|
12
|
-
emptyBlocksForm,
|
|
13
|
-
getBlocksLayoutFieldname,
|
|
14
|
-
} from '@plone/volto/helpers';
|
|
15
16
|
import PropTypes from 'prop-types';
|
|
16
|
-
import {
|
|
17
|
-
import EditBlockWrapper from './EditBlockWrapper';
|
|
17
|
+
import { Segment } from 'semantic-ui-react';
|
|
18
18
|
import EditSchema from './EditSchema';
|
|
19
|
+
|
|
19
20
|
import CounterComponent from './CounterComponent';
|
|
20
|
-
import helpSVG from '@plone/volto/icons/help.svg';
|
|
21
21
|
import './editor.less';
|
|
22
22
|
|
|
23
23
|
const Edit = (props) => {
|
|
24
|
-
const {
|
|
25
|
-
block,
|
|
26
|
-
data,
|
|
27
|
-
onChangeBlock,
|
|
28
|
-
onChangeField,
|
|
29
|
-
pathname,
|
|
30
|
-
selected,
|
|
31
|
-
manage,
|
|
32
|
-
formDescription,
|
|
33
|
-
} = props;
|
|
34
|
-
const metadata = props.metadata || props.properties;
|
|
24
|
+
const { block, data, onChangeBlock, selected, formDescription } = props;
|
|
35
25
|
const [multiSelected, setMultiSelected] = useState([]);
|
|
36
26
|
const data_blocks = data?.data?.blocks;
|
|
37
|
-
const
|
|
27
|
+
const childBlocksForm = isEmpty(data_blocks) ? emptyBlocksForm() : data.data;
|
|
38
28
|
|
|
39
29
|
const [selectedBlock, setSelectedBlock] = useState(
|
|
40
|
-
|
|
30
|
+
childBlocksForm.blocks_layout.items[0],
|
|
41
31
|
);
|
|
42
32
|
|
|
43
|
-
const blockState = {};
|
|
44
33
|
const handleKeyDown = (
|
|
45
34
|
e,
|
|
46
35
|
index,
|
|
@@ -131,15 +120,15 @@ const Edit = (props) => {
|
|
|
131
120
|
React.useEffect(() => {
|
|
132
121
|
if (
|
|
133
122
|
isEmpty(data_blocks) &&
|
|
134
|
-
|
|
123
|
+
childBlocksForm.blocks_layout.items[0] !== selectedBlock
|
|
135
124
|
) {
|
|
136
|
-
setSelectedBlock(
|
|
125
|
+
setSelectedBlock(childBlocksForm.blocks_layout.items[0]);
|
|
137
126
|
onChangeBlock(block, {
|
|
138
127
|
...data,
|
|
139
|
-
data:
|
|
128
|
+
data: childBlocksForm,
|
|
140
129
|
});
|
|
141
130
|
}
|
|
142
|
-
}, [onChangeBlock,
|
|
131
|
+
}, [onChangeBlock, childBlocksForm, selectedBlock, block, data, data_blocks]);
|
|
143
132
|
|
|
144
133
|
// Get editing instructions from block settings or props
|
|
145
134
|
let instructions = data?.instructions?.data || data?.instructions;
|
|
@@ -167,6 +156,16 @@ const Edit = (props) => {
|
|
|
167
156
|
>
|
|
168
157
|
{data.title || 'Section'}
|
|
169
158
|
</legend>
|
|
159
|
+
<BodyComponent
|
|
160
|
+
{...props}
|
|
161
|
+
isEditMode={true}
|
|
162
|
+
selectedBlock={selectedBlock}
|
|
163
|
+
setSelectedBlock={setSelectedBlock}
|
|
164
|
+
multiSelected={multiSelected}
|
|
165
|
+
setMultiSelected={setMultiSelected}
|
|
166
|
+
onSelectBlock={onSelectBlock}
|
|
167
|
+
childBlocksForm={childBlocksForm}
|
|
168
|
+
/>
|
|
170
169
|
{selected ? (
|
|
171
170
|
<BlocksToolbar
|
|
172
171
|
selectedBlock={Object.keys(selectedBlock || {})[0]}
|
|
@@ -189,74 +188,6 @@ const Edit = (props) => {
|
|
|
189
188
|
) : (
|
|
190
189
|
''
|
|
191
190
|
)}
|
|
192
|
-
<BlocksForm
|
|
193
|
-
metadata={metadata}
|
|
194
|
-
properties={properties}
|
|
195
|
-
manage={manage}
|
|
196
|
-
selectedBlock={selected ? selectedBlock : null}
|
|
197
|
-
allowedBlocks={data.allowedBlocks}
|
|
198
|
-
title={data.placeholder}
|
|
199
|
-
description={instructions}
|
|
200
|
-
onSelectBlock={(id, l, e) => {
|
|
201
|
-
const isMultipleSelection = e
|
|
202
|
-
? e.shiftKey || e.ctrlKey || e.metaKey
|
|
203
|
-
: false;
|
|
204
|
-
onSelectBlock(id, isMultipleSelection, e, selectedBlock);
|
|
205
|
-
}}
|
|
206
|
-
onChangeFormData={(newFormData) => {
|
|
207
|
-
onChangeBlock(block, {
|
|
208
|
-
...data,
|
|
209
|
-
data: newFormData,
|
|
210
|
-
});
|
|
211
|
-
}}
|
|
212
|
-
onChangeField={(id, value) => {
|
|
213
|
-
if (['blocks', 'blocks_layout'].indexOf(id) > -1) {
|
|
214
|
-
blockState[id] = value;
|
|
215
|
-
onChangeBlock(block, {
|
|
216
|
-
...data,
|
|
217
|
-
data: {
|
|
218
|
-
...data.data,
|
|
219
|
-
...blockState,
|
|
220
|
-
},
|
|
221
|
-
});
|
|
222
|
-
} else {
|
|
223
|
-
onChangeField(id, value);
|
|
224
|
-
}
|
|
225
|
-
}}
|
|
226
|
-
pathname={pathname}
|
|
227
|
-
>
|
|
228
|
-
{({ draginfo }, editBlock, blockProps) => (
|
|
229
|
-
<EditBlockWrapper
|
|
230
|
-
draginfo={draginfo}
|
|
231
|
-
blockProps={blockProps}
|
|
232
|
-
disabled={data.disableInnerButtons}
|
|
233
|
-
extraControls={
|
|
234
|
-
<>
|
|
235
|
-
{instructions && (
|
|
236
|
-
<>
|
|
237
|
-
<Button
|
|
238
|
-
icon
|
|
239
|
-
basic
|
|
240
|
-
title="Section help"
|
|
241
|
-
onClick={() => {
|
|
242
|
-
setSelectedBlock();
|
|
243
|
-
const tab = manage ? 0 : 1;
|
|
244
|
-
props.setSidebarTab(tab);
|
|
245
|
-
}}
|
|
246
|
-
>
|
|
247
|
-
<Icon name={helpSVG} className="" size="19px" />
|
|
248
|
-
</Button>
|
|
249
|
-
</>
|
|
250
|
-
)}
|
|
251
|
-
</>
|
|
252
|
-
}
|
|
253
|
-
multiSelected={multiSelected.includes(blockProps.block)}
|
|
254
|
-
>
|
|
255
|
-
{editBlock}
|
|
256
|
-
</EditBlockWrapper>
|
|
257
|
-
)}
|
|
258
|
-
</BlocksForm>
|
|
259
|
-
|
|
260
191
|
{props.data.maxChars && (
|
|
261
192
|
<CounterComponent {...props} setSelectedBlock={setSelectedBlock} />
|
|
262
193
|
)}
|
|
@@ -293,4 +224,4 @@ Edit.propTypes = {
|
|
|
293
224
|
manage: PropTypes.bool.isRequired,
|
|
294
225
|
};
|
|
295
226
|
|
|
296
|
-
export default Edit;
|
|
227
|
+
export default withBlockExtensions(Edit);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import Edit from './Edit';
|
|
2
|
+
import { default as Edit } from './Edit';
|
|
3
3
|
import configureStore from 'redux-mock-store';
|
|
4
4
|
import { Provider } from 'react-intl-redux';
|
|
5
5
|
import thunk from 'redux-thunk';
|
|
@@ -15,6 +15,21 @@ const store = mockStore({
|
|
|
15
15
|
},
|
|
16
16
|
});
|
|
17
17
|
|
|
18
|
+
jest.mock('@plone/volto/components', () => ({
|
|
19
|
+
BlocksForm: jest.fn(() => <div className="blocks-form">RenderBlocks</div>),
|
|
20
|
+
Icon: () => <div>Icon</div>,
|
|
21
|
+
SidebarPortal: () => <div>SidebarPortal</div>,
|
|
22
|
+
BlocksToolbar: () => <div>BlocksToolbar</div>,
|
|
23
|
+
BlockDataForm: () => <div>BlockDataForm</div>,
|
|
24
|
+
RenderBlocks: jest.fn(() => <div>RenderBlocks</div>),
|
|
25
|
+
}));
|
|
26
|
+
|
|
27
|
+
jest.mock('@plone/volto/helpers', () => ({
|
|
28
|
+
withBlockExtensions: jest.fn((Component) => Component),
|
|
29
|
+
emptyBlocksForm: jest.fn(),
|
|
30
|
+
getBlocksLayoutFieldname: jest.fn(),
|
|
31
|
+
}));
|
|
32
|
+
|
|
18
33
|
describe('Edit', () => {
|
|
19
34
|
const onChangeBlock = jest.fn();
|
|
20
35
|
const onChangeField = jest.fn();
|
|
@@ -41,6 +56,7 @@ describe('Edit', () => {
|
|
|
41
56
|
pathname: '/',
|
|
42
57
|
selected: true,
|
|
43
58
|
manage: true,
|
|
59
|
+
variation: {},
|
|
44
60
|
};
|
|
45
61
|
|
|
46
62
|
it('should render without crashing', () => {
|
|
@@ -101,6 +117,7 @@ describe('Edit', () => {
|
|
|
101
117
|
pathname: '/',
|
|
102
118
|
selected: true,
|
|
103
119
|
manage: true,
|
|
120
|
+
variation: {},
|
|
104
121
|
};
|
|
105
122
|
const mockOnFocusPreviousBlock = jest.fn();
|
|
106
123
|
const mockOnFocusNextBlock = jest.fn();
|
|
@@ -163,6 +180,7 @@ describe('Edit', () => {
|
|
|
163
180
|
pathname: '/',
|
|
164
181
|
selected: true,
|
|
165
182
|
manage: true,
|
|
183
|
+
variation: {},
|
|
166
184
|
};
|
|
167
185
|
const mockOnFocusPreviousBlock = jest.fn();
|
|
168
186
|
const mockOnFocusNextBlock = jest.fn();
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { withBlockExtensions } from '@plone/volto/helpers';
|
|
3
|
+
import BodyComponent from './Body';
|
|
3
4
|
|
|
4
5
|
const View = (props) => {
|
|
5
6
|
const { data } = props;
|
|
6
|
-
const metadata = props.metadata || props.properties;
|
|
7
7
|
const CustomTag = `${data.as || 'div'}`;
|
|
8
8
|
const customId = data?.title
|
|
9
9
|
?.toLowerCase()
|
|
@@ -12,9 +12,9 @@ const View = (props) => {
|
|
|
12
12
|
?.replace(/\s+/gi, '-');
|
|
13
13
|
return (
|
|
14
14
|
<CustomTag id={customId}>
|
|
15
|
-
<
|
|
15
|
+
<BodyComponent {...props} />
|
|
16
16
|
</CustomTag>
|
|
17
17
|
);
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
export default View;
|
|
20
|
+
export default withBlockExtensions(View);
|
|
@@ -7,6 +7,11 @@ import '@testing-library/jest-dom/extend-expect';
|
|
|
7
7
|
|
|
8
8
|
jest.mock('@plone/volto/components', () => ({
|
|
9
9
|
RenderBlocks: jest.fn(() => <div>RenderBlocks</div>),
|
|
10
|
+
BodyComponent: () => <div>BodyComponent</div>,
|
|
11
|
+
}));
|
|
12
|
+
|
|
13
|
+
jest.mock('@plone/volto/helpers', () => ({
|
|
14
|
+
withBlockExtensions: jest.fn((Component) => Component),
|
|
10
15
|
}));
|
|
11
16
|
|
|
12
17
|
describe('View', () => {
|
|
@@ -15,6 +20,7 @@ describe('View', () => {
|
|
|
15
20
|
data: {},
|
|
16
21
|
metadata: {},
|
|
17
22
|
properties: {},
|
|
23
|
+
variation: {},
|
|
18
24
|
};
|
|
19
25
|
const component = renderer.create(<View {...props} />);
|
|
20
26
|
|
|
@@ -24,9 +30,12 @@ describe('View', () => {
|
|
|
24
30
|
|
|
25
31
|
it('renders with default tag and without crashing', () => {
|
|
26
32
|
const props = {
|
|
27
|
-
data: {
|
|
33
|
+
data: {
|
|
34
|
+
variation: {},
|
|
35
|
+
},
|
|
28
36
|
metadata: {},
|
|
29
37
|
properties: {},
|
|
38
|
+
variation: {},
|
|
30
39
|
};
|
|
31
40
|
const { container } = render(<View {...props} />);
|
|
32
41
|
expect(container.querySelector('div')).toBeInTheDocument();
|
|
@@ -40,6 +49,7 @@ describe('View', () => {
|
|
|
40
49
|
data: { key: 'value' },
|
|
41
50
|
},
|
|
42
51
|
properties: {},
|
|
52
|
+
variation: {},
|
|
43
53
|
};
|
|
44
54
|
const { container } = render(<View {...props} />);
|
|
45
55
|
expect(container.querySelector('section')).toBeInTheDocument();
|
|
@@ -55,6 +65,7 @@ describe('View', () => {
|
|
|
55
65
|
},
|
|
56
66
|
metadata: { meta: 'data' },
|
|
57
67
|
properties: { prop: 'erty' },
|
|
68
|
+
variation: {},
|
|
58
69
|
};
|
|
59
70
|
render(<View {...props} />);
|
|
60
71
|
expect(RenderBlocks).toHaveBeenCalledWith(
|
package/src/index.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { getBlocks } from '@plone/volto/helpers';
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import {
|
|
3
|
+
GroupBlockEdit,
|
|
4
|
+
GroupBlockView,
|
|
5
|
+
GroupBlockLayout,
|
|
6
|
+
GroupBlockDefaultBody,
|
|
7
|
+
} from './components';
|
|
4
8
|
import codeSVG from '@plone/volto/icons/row.svg';
|
|
5
9
|
|
|
6
10
|
const applyConfig = (config) => {
|
|
@@ -45,6 +49,14 @@ const applyConfig = (config) => {
|
|
|
45
49
|
addPermission: [],
|
|
46
50
|
view: [],
|
|
47
51
|
},
|
|
52
|
+
variations: [
|
|
53
|
+
{
|
|
54
|
+
id: 'default',
|
|
55
|
+
isDefault: true,
|
|
56
|
+
title: 'Default',
|
|
57
|
+
template: GroupBlockDefaultBody,
|
|
58
|
+
},
|
|
59
|
+
],
|
|
48
60
|
tocEntries: (block = {}, tocData) => {
|
|
49
61
|
// integration with volto-block-toc
|
|
50
62
|
const headlines = tocData.levels || ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
|