@eeacms/volto-group-block 5.0.0 → 6.0.0

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.
@@ -1,7 +1,9 @@
1
1
  const fs = require('fs');
2
2
  const path = require('path');
3
3
 
4
- const projectRootPath = fs.realpathSync('./project'); // __dirname
4
+ const projectRootPath = fs.existsSync('./project')
5
+ ? fs.realpathSync('./project')
6
+ : fs.realpathSync('./../../../');
5
7
  const packageJson = require(path.join(projectRootPath, 'package.json'));
6
8
  const jsConfig = require(path.join(projectRootPath, 'jsconfig.json')).compilerOptions;
7
9
 
package/CHANGELOG.md CHANGED
@@ -4,11 +4,23 @@ 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
- ### [5.0.0](https://github.com/eea/volto-group-block/compare/4.3.8...5.0.0) - 27 October 2022
7
+ ### [6.0.0](https://github.com/eea/volto-group-block/compare/5.0.1...6.0.0) - 24 March 2023
8
+
9
+ #### :hammer_and_wrench: Others
10
+
11
+ - (feat): Possibility to copy/cut/paste blocks within section group block - refs #157469 [dobri1408 - [`e9fc098`](https://github.com/eea/volto-group-block/commit/e9fc09825ba2ae258feb77864491d97d94c585b4)]
12
+ - test(Jenkins): Run tests and cypress with latest canary @plone/volto [Alin Voinea - [`2f42e7c`](https://github.com/eea/volto-group-block/commit/2f42e7c19a1da5a9c6a883cb4f101e8fa224ff94)]
13
+ ### [5.0.1](https://github.com/eea/volto-group-block/compare/5.0.0...5.0.1) - 16 November 2022
8
14
 
9
15
  #### :nail_care: Enhancements
10
16
 
11
- - refactor: Latest volto compatibility [Miu Razvan - [`f4d7a93`](https://github.com/eea/volto-group-block/commit/f4d7a933c166d5501a5e147fdd6664840a67047e)]
17
+ - change(group): use BlockDataForm instead of InlineForm for schema enhancer support within Edit block view [David Ichim - [`9211075`](https://github.com/eea/volto-group-block/commit/921107596d19b96f2d749d59763b8f9909c469f2)]
18
+
19
+ #### :hammer_and_wrench: Others
20
+
21
+ - test(estlint): Fix .project.eslintrc.js [Alin Voinea - [`9f995f7`](https://github.com/eea/volto-group-block/commit/9f995f73f9866643c944ce44175b45d2f16dffca)]
22
+ - test(cypress): Rename [Alin Voinea - [`814d50c`](https://github.com/eea/volto-group-block/commit/814d50c7c88ab2675c4d7f042feff6aa233c1c7e)]
23
+ ## [5.0.0](https://github.com/eea/volto-group-block/compare/4.3.8...5.0.0) - 27 October 2022
12
24
 
13
25
  #### :hammer_and_wrench: Others
14
26
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeacms/volto-group-block",
3
- "version": "5.0.0",
3
+ "version": "6.0.0",
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",
@@ -18,10 +18,9 @@
18
18
  "type": "git",
19
19
  "url": "git@github.com:eea/volto-group-block.git"
20
20
  },
21
- "dependencies": {},
22
21
  "devDependencies": {
23
- "@plone/scripts": "*",
24
22
  "@cypress/code-coverage": "^3.10.0",
23
+ "@plone/scripts": "*",
25
24
  "babel-plugin-transform-class-properties": "^6.24.1",
26
25
  "md5": "^2.3.0"
27
26
  },
@@ -1,12 +1,16 @@
1
1
  import React, { useState } from 'react';
2
- import { isEmpty } from 'lodash';
2
+ import { isEmpty, without } from 'lodash';
3
3
  import {
4
4
  BlocksForm,
5
5
  SidebarPortal,
6
6
  Icon,
7
- InlineForm,
7
+ BlockDataForm,
8
+ BlocksToolbar,
8
9
  } from '@plone/volto/components';
9
- import { emptyBlocksForm } from '@plone/volto/helpers';
10
+ import {
11
+ emptyBlocksForm,
12
+ getBlocksLayoutFieldname,
13
+ } from '@plone/volto/helpers';
10
14
  import delightedSVG from '@plone/volto/icons/delighted.svg';
11
15
  import dissatisfiedSVG from '@plone/volto/icons/dissatisfied.svg';
12
16
  import PropTypes from 'prop-types';
@@ -28,15 +32,72 @@ const Edit = (props) => {
28
32
  manage,
29
33
  formDescription,
30
34
  } = props;
35
+ const onSelectBlock = (id, isMultipleSelection, event, activeBlock) => {
36
+ let newMultiSelected = [];
37
+ let selected = id;
38
+
39
+ if (isMultipleSelection) {
40
+ selected = null;
41
+ const blocksLayoutFieldname = getBlocksLayoutFieldname(data?.data);
42
+ const blocks_layout = data?.data[blocksLayoutFieldname].items;
43
+ if (event.shiftKey) {
44
+ const anchor =
45
+ multiSelected.length > 0
46
+ ? blocks_layout.indexOf(multiSelected[0])
47
+ : blocks_layout.indexOf(activeBlock);
48
+ const focus = blocks_layout.indexOf(id);
49
+ if (anchor === focus) {
50
+ newMultiSelected = [id];
51
+ } else if (focus > anchor) {
52
+ newMultiSelected = [...blocks_layout.slice(anchor, focus + 1)];
53
+ } else {
54
+ newMultiSelected = [...blocks_layout.slice(focus, anchor + 1)];
55
+ }
56
+ }
57
+ if ((event.ctrlKey || event.metaKey) && !event.shiftKey) {
58
+ if (multiSelected.includes(id)) {
59
+ selected = null;
60
+ newMultiSelected = without(multiSelected, id);
61
+ } else {
62
+ newMultiSelected = [...(multiSelected || []), id];
63
+ }
64
+ }
65
+ }
31
66
 
67
+ setSelectedBlock(selected);
68
+ setMultiSelected(newMultiSelected);
69
+ };
32
70
  const metadata = props.metadata || props.properties;
71
+ const [multiSelected, setMultiSelected] = useState([]);
33
72
  const data_blocks = data?.data?.blocks;
34
73
  const properties = isEmpty(data_blocks) ? emptyBlocksForm() : data.data;
35
74
 
36
75
  const [selectedBlock, setSelectedBlock] = useState(
37
76
  properties.blocks_layout.items[0],
38
77
  );
39
-
78
+ const changeBlockData = (newBlockData) => {
79
+ let pastedBlocks = newBlockData.blocks_layout.items.filter((blockID) => {
80
+ if (data?.data?.blocks_layout.items.find((x) => x === blockID))
81
+ return false;
82
+ return true;
83
+ });
84
+ const selectedIndex =
85
+ data.data.blocks_layout.items.indexOf(selectedBlock) + 1;
86
+ onChangeBlock(block, {
87
+ ...data,
88
+ data: {
89
+ ...data?.data,
90
+ ...newBlockData,
91
+ blocks_layout: {
92
+ items: [
93
+ ...data.data.blocks_layout.items.slice(0, selectedIndex),
94
+ ...pastedBlocks,
95
+ ...data.data.blocks_layout.items.slice(selectedIndex),
96
+ ],
97
+ },
98
+ },
99
+ });
100
+ };
40
101
  React.useEffect(() => {
41
102
  if (
42
103
  isEmpty(data_blocks) &&
@@ -165,6 +226,28 @@ const Edit = (props) => {
165
226
  >
166
227
  {data.title || 'Section'}
167
228
  </legend>
229
+ {selected ? (
230
+ <BlocksToolbar
231
+ selectedBlock={Object.keys(selectedBlock || {})[0]}
232
+ selectedBlocks={multiSelected}
233
+ onSetSelectedBlocks={(blockIds) => {
234
+ setMultiSelected(blockIds);
235
+ }}
236
+ formData={data.data}
237
+ onSelectBlock={(id, l, e) => {
238
+ const isMultipleSelection = e
239
+ ? e.shiftKey || e.ctrlKey || e.metaKey
240
+ : false;
241
+
242
+ onSelectBlock(id, isMultipleSelection, e, selectedBlock);
243
+ }}
244
+ onChangeBlocks={(newBlockData) => {
245
+ changeBlockData(newBlockData);
246
+ }}
247
+ />
248
+ ) : (
249
+ ''
250
+ )}
168
251
  <BlocksForm
169
252
  metadata={metadata}
170
253
  properties={properties}
@@ -173,8 +256,11 @@ const Edit = (props) => {
173
256
  allowedBlocks={data.allowedBlocks}
174
257
  title={data.placeholder}
175
258
  description={instructions}
176
- onSelectBlock={(id) => {
177
- setSelectedBlock(id);
259
+ onSelectBlock={(id, l, e) => {
260
+ const isMultipleSelection = e
261
+ ? e.shiftKey || e.ctrlKey || e.metaKey
262
+ : false;
263
+ onSelectBlock(id, isMultipleSelection, e, selectedBlock);
178
264
  }}
179
265
  onChangeFormData={(newFormData) => {
180
266
  onChangeBlock(block, {
@@ -223,6 +309,7 @@ const Edit = (props) => {
223
309
  )}
224
310
  </>
225
311
  }
312
+ multiSelected={multiSelected.includes(blockProps.block)}
226
313
  >
227
314
  {editBlock}
228
315
  </EditBlockWrapper>
@@ -237,7 +324,7 @@ const Edit = (props) => {
237
324
  </Segment>
238
325
  )}
239
326
  {!data?.readOnlySettings && (
240
- <InlineForm
327
+ <BlockDataForm
241
328
  schema={EditSchema}
242
329
  title="Section (Group) settings"
243
330
  formData={data}