@plone/volto-slate 18.8.0 → 18.9.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.
package/CHANGELOG.md CHANGED
@@ -8,6 +8,24 @@
8
8
 
9
9
  <!-- towncrier release notes start -->
10
10
 
11
+ ## 18.9.0 (2026-04-07)
12
+
13
+ ### Feature
14
+
15
+ - Add gl translations @xulioxesus
16
+ Fix nl translation @ingovdb [#7941](https://github.com/plone/volto/issues/7941)
17
+
18
+ ### Internal
19
+
20
+ - Run volto-slate test suite as part of the Vitest multi-project setup. @Abhishek-17h [#7892](https://github.com/plone/volto/issues/7892)
21
+ - Update dependency: lodash 4.17.23. @davisagli
22
+
23
+ ## 18.8.1 (2026-03-02)
24
+
25
+ ### Bugfix
26
+
27
+ - Use Slate Table block when pasting tables snippets (instead of deprecated DraftJS) @cekk [#7865](https://github.com/plone/volto/issues/7865)
28
+
11
29
  ## 18.8.0 (2025-12-02)
12
30
 
13
31
  ### Feature
@@ -2,13 +2,15 @@ msgid ""
2
2
  msgstr ""
3
3
  "Project-Id-Version: Plone\n"
4
4
  "POT-Creation-Date: 2022-07-20T12:45:09.681Z\n"
5
- "Last-Translator: Automatically generated\n"
6
- "Language-Team: none\n"
5
+ "PO-Revision-Date: 2026-03-01 23:09+0000\n"
6
+ "Last-Translator: xulioxesus <xulioxesus@gmail.com>\n"
7
+ "Language-Team: Galician <https://hosted.weblate.org/projects/plone/volto-slate-18/gl/>\n"
7
8
  "Language: gl\n"
8
9
  "MIME-Version: 1.0\n"
9
10
  "Content-Type: text/plain; charset=utf-8\n"
10
11
  "Content-Transfer-Encoding: 8bit\n"
11
12
  "Plural-Forms: nplurals=2; plural=n != 1;\n"
13
+ "X-Generator: Weblate 5.16.1-dev\n"
12
14
  "Language-Code: en\n"
13
15
  "Language-Name: English\n"
14
16
  "Preferred-Encodings: utf-8\n"
@@ -17,167 +19,167 @@ msgstr ""
17
19
  # defaultMessage: Add link
18
20
  #: editor/plugins/Link/index
19
21
  msgid "Add link"
20
- msgstr ""
22
+ msgstr "Engadir ligazón"
21
23
 
22
24
  # defaultMessage: An error has occurred while editing "{name}" field. We have been notified and we are looking into it. Please save your work and retry. If the issue persists please contact the site administrator.
23
25
  #: widgets/HtmlSlateWidget
24
26
  msgid "An error has occurred while editing "{name}" field. We have been notified and we are looking into it. Please save your work and retry. If the issue persists please contact the site administrator."
25
- msgstr ""
27
+ msgstr "Ocurriu un erro mentres editaba o campo '{name}'. Fomos notificados e estamos investigando nelo. Por favor, garda o teu traballo e reintenta. Se o problema persiste contacta co administrador do sitio."
26
28
 
27
29
  # defaultMessage: An error has occurred while rendering "{name}" field. We have been notified and we are looking into it. If the issue persists please contact the site administrator.
28
30
  #: widgets/RichTextWidgetView
29
31
  msgid "An error has occurred while rendering "{name}" field. We have been notified and we are looking into it. If the issue persists please contact the site administrator."
30
- msgstr ""
32
+ msgstr "Ocurriu un erro mentres se amosaba o campo '{name}'. Fomos notificados e estamos investigando nelo. Se o problema persiste contacta co administrador do sitio."
31
33
 
32
34
  # defaultMessage: Bottom
33
35
  #: blocks/Table/TableBlockEdit
34
36
  msgid "Bottom"
35
- msgstr ""
37
+ msgstr "Abaixo"
36
38
 
37
39
  # defaultMessage: Center
38
40
  #: blocks/Table/TableBlockEdit
39
41
  msgid "Center"
40
- msgstr ""
42
+ msgstr "Centrar"
41
43
 
42
44
  # defaultMessage: Delete col
43
45
  #: blocks/Table/TableBlockEdit
44
46
  #: editor/plugins/Table/index
45
47
  msgid "Delete col"
46
- msgstr ""
48
+ msgstr "Eliminar col"
47
49
 
48
50
  # defaultMessage: Delete row
49
51
  #: blocks/Table/TableBlockEdit
50
52
  #: editor/plugins/Table/index
51
53
  msgid "Delete row"
52
- msgstr ""
54
+ msgstr "Eliminar fila"
53
55
 
54
56
  # defaultMessage: Delete table
55
57
  #: editor/plugins/Table/index
56
58
  msgid "Delete table"
57
- msgstr ""
59
+ msgstr "Eliminar táboa"
58
60
 
59
61
  # defaultMessage: Divide each row into separate cells
60
62
  #: blocks/Table/TableBlockEdit
61
63
  msgid "Divide each row into separate cells"
62
- msgstr ""
64
+ msgstr "Dividir cada fila en celas separadas"
63
65
 
64
66
  # defaultMessage: Edit element
65
67
  #: elementEditor/messages
66
68
  msgid "Edit element"
67
- msgstr ""
69
+ msgstr "Editar elemento"
68
70
 
69
71
  # defaultMessage: Edit link
70
72
  #: editor/plugins/AdvancedLink/index
71
73
  #: editor/plugins/Link/index
72
74
  msgid "Edit link"
73
- msgstr ""
75
+ msgstr "Editar ligazón"
74
76
 
75
77
  # defaultMessage: Fixed width table cells
76
78
  #: blocks/Table/TableBlockEdit
77
79
  msgid "Fixed width table cells"
78
- msgstr ""
80
+ msgstr "Celas de táboa de ancho fixo"
79
81
 
80
82
  # defaultMessage: Hide headers
81
83
  #: blocks/Table/TableBlockEdit
82
84
  msgid "Hide headers"
83
- msgstr ""
85
+ msgstr "Ocultar cabeceiras"
84
86
 
85
87
  # defaultMessage: Insert col after
86
88
  #: blocks/Table/TableBlockEdit
87
89
  #: editor/plugins/Table/index
88
90
  msgid "Insert col after"
89
- msgstr ""
91
+ msgstr "Insertar col despois"
90
92
 
91
93
  # defaultMessage: Insert col before
92
94
  #: blocks/Table/TableBlockEdit
93
95
  #: editor/plugins/Table/index
94
96
  msgid "Insert col before"
95
- msgstr ""
97
+ msgstr "Insertar col antes"
96
98
 
97
99
  # defaultMessage: Insert row after
98
100
  #: blocks/Table/TableBlockEdit
99
101
  #: editor/plugins/Table/index
100
102
  msgid "Insert row after"
101
- msgstr ""
103
+ msgstr "Insertar fila despois"
102
104
 
103
105
  # defaultMessage: Insert row before
104
106
  #: blocks/Table/TableBlockEdit
105
107
  #: editor/plugins/Table/index
106
108
  msgid "Insert row before"
107
- msgstr ""
109
+ msgstr "Insertar fila antes"
108
110
 
109
111
  # defaultMessage: Left
110
112
  #: blocks/Table/TableBlockEdit
111
113
  msgid "Left"
112
- msgstr ""
114
+ msgstr "Esquerda"
113
115
 
114
116
  # defaultMessage: Make the table compact
115
117
  #: blocks/Table/TableBlockEdit
116
118
  msgid "Make the table compact"
117
- msgstr ""
119
+ msgstr "Facer a táboa compacta"
118
120
 
119
121
  # defaultMessage: Make the table sortable
120
122
  #: blocks/Table/TableBlockEdit
121
123
  msgid "Make the table sortable"
122
- msgstr ""
124
+ msgstr "Facer a táboa ordenable"
123
125
 
124
126
  # defaultMessage: Middle
125
127
  #: blocks/Table/TableBlockEdit
126
128
  msgid "Middle"
127
- msgstr ""
129
+ msgstr "Medio"
128
130
 
129
131
  # defaultMessage: No matching blocks
130
132
  #: blocks/Text/SlashMenu
131
133
  msgid "No matching blocks"
132
- msgstr ""
134
+ msgstr "Bloques sen coincidencia"
133
135
 
134
136
  # defaultMessage: Reduce complexity
135
137
  #: blocks/Table/TableBlockEdit
136
138
  msgid "Reduce complexity"
137
- msgstr ""
139
+ msgstr "Reducir complexidade"
138
140
 
139
141
  # defaultMessage: Remove element
140
142
  #: elementEditor/messages
141
143
  msgid "Remove element"
142
- msgstr ""
144
+ msgstr "Eliminar elemento"
143
145
 
144
146
  # defaultMessage: Remove link
145
147
  #: editor/plugins/AdvancedLink/index
146
148
  msgid "Remove link"
147
- msgstr ""
149
+ msgstr "Elminar ligazón"
148
150
 
149
151
  # defaultMessage: Right
150
152
  #: blocks/Table/TableBlockEdit
151
153
  msgid "Right"
152
- msgstr ""
154
+ msgstr "Dereita"
153
155
 
154
156
  # defaultMessage: Stripe alternate rows with color
155
157
  #: blocks/Table/TableBlockEdit
156
158
  msgid "Stripe alternate rows with color"
157
- msgstr ""
159
+ msgstr "Raia filas alternas con color"
158
160
 
159
161
  # defaultMessage: Table
160
162
  #: blocks/Table/TableBlockEdit
161
163
  msgid "Table"
162
- msgstr ""
164
+ msgstr "Táboa"
163
165
 
164
166
  # defaultMessage: Table color inverted
165
167
  #: blocks/Table/TableBlockEdit
166
168
  msgid "Table color inverted"
167
- msgstr ""
169
+ msgstr "Táboa de cor invertida"
168
170
 
169
171
  # defaultMessage: Top
170
172
  #: blocks/Table/TableBlockEdit
171
173
  msgid "Top"
172
- msgstr ""
174
+ msgstr "Arriba"
173
175
 
174
176
  # defaultMessage: Type text…
175
177
  #: blocks/Text/DefaultTextBlockEditor
176
178
  #: blocks/Text/DetachedTextBlockEditor
177
179
  msgid "Type text…"
178
- msgstr ""
180
+ msgstr "Escriba texto…"
179
181
 
180
182
  # defaultMessage: Visible only in view mode
181
183
  #: blocks/Table/TableBlockEdit
182
184
  msgid "Visible only in view mode"
183
- msgstr ""
185
+ msgstr "Visible só en modo vista"
@@ -3,13 +3,14 @@ msgstr ""
3
3
  "Project-Id-Version: \n"
4
4
  "Report-Msgid-Bugs-To: \n"
5
5
  "POT-Creation-Date: \n"
6
- "PO-Revision-Date: \n"
7
- "Last-Translator: \n"
8
- "Language: \n"
9
- "Language-Team: \n"
6
+ "PO-Revision-Date: 2026-02-24 10:09+0000\n"
7
+ "Last-Translator: Ingo Van den Broeck <in.vandenbroeck@vmm.be>\n"
8
+ "Language-Team: Dutch <https://hosted.weblate.org/projects/plone/volto-slate-18/nl/>\n"
9
+ "Language: nl\n"
10
10
  "Content-Type: \n"
11
11
  "Content-Transfer-Encoding: \n"
12
- "Plural-Forms: \n"
12
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
13
+ "X-Generator: Weblate 5.16.1-dev\n"
13
14
 
14
15
  #: editor/plugins/Link/index
15
16
  msgid "Add link"
@@ -79,7 +80,7 @@ msgstr "Kolom links invoegen"
79
80
  #: blocks/Table/TableBlockEdit
80
81
  #: editor/plugins/Table/index
81
82
  msgid "Insert row after"
82
- msgstr "Rij onder toevoegen"
83
+ msgstr "Rij onder invoegen"
83
84
 
84
85
  #: blocks/Table/TableBlockEdit
85
86
  #: editor/plugins/Table/index
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plone/volto-slate",
3
- "version": "18.8.0",
3
+ "version": "18.9.0",
4
4
  "description": "Slate.js integration with Volto",
5
5
  "main": "src/index.js",
6
6
  "author": "European Environment Agency: IDM2 A-Team",
@@ -28,7 +28,7 @@
28
28
  "is-hotkey": "0.2.0",
29
29
  "is-url": "1.2.4",
30
30
  "jsdom": "^16.6.0",
31
- "lodash": "4.17.21",
31
+ "lodash": "4.17.23",
32
32
  "react-intersection-observer": "9.1.0",
33
33
  "react-intl": "3.12.1",
34
34
  "react-redux": "8.1.2",
@@ -0,0 +1,3 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`renders a cell component 1`] = `null`;
@@ -1,4 +1,4 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
3
  exports[`renders an edit table block component 1`] = `
4
4
  <div
@@ -1,4 +1,4 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
3
  exports[`renders a view table component 1`] = `
4
4
  <table
@@ -11,8 +11,11 @@ exports[`renders a view table component 1`] = `
11
11
  className=""
12
12
  >
13
13
  <th
14
+ aria-sort="none"
14
15
  className="left aligned middle aligned"
15
16
  onClick={[Function]}
17
+ onKeyDown={[Function]}
18
+ tabIndex="-1"
16
19
  >
17
20
  <h2>
18
21
  My header
@@ -19,7 +19,7 @@ import {
19
19
  export function syncCreateTableBlock(rows) {
20
20
  const id = uuid();
21
21
  const block = {
22
- '@type': 'table',
22
+ '@type': 'slateTable',
23
23
  table: {
24
24
  rows,
25
25
  },
@@ -0,0 +1,24 @@
1
+ import { syncCreateTableBlock } from './deconstruct';
2
+
3
+ describe('syncCreateTableBlock', () => {
4
+ it('creates a slateTable block with the given rows', () => {
5
+ const rows = [
6
+ {
7
+ key: 'row1',
8
+ cells: [
9
+ {
10
+ key: 'cell1',
11
+ type: 'data',
12
+ value: [{ children: [{ text: '1' }] }],
13
+ },
14
+ ],
15
+ },
16
+ ];
17
+
18
+ const [id, block] = syncCreateTableBlock(rows);
19
+
20
+ expect(id).toBeDefined();
21
+ expect(block['@type']).toBe('slateTable');
22
+ expect(block.table.rows).toEqual(rows);
23
+ });
24
+ });
@@ -1,17 +1,22 @@
1
1
  import React from 'react';
2
- import configureStore from 'redux-mock-store';
3
- import { Provider } from 'react-intl-redux';
2
+ import { createStore } from 'redux';
3
+ import { Provider } from 'react-redux';
4
+ import { IntlProvider } from 'react-intl';
4
5
  import { render } from '@testing-library/react';
5
6
  import config from '@plone/volto/registry';
6
7
  import TextBlockEdit from './TextBlockEdit';
7
8
  import { mockAllIsIntersecting } from 'react-intersection-observer/test-utils';
8
9
 
9
- const mockStore = configureStore();
10
+ // Create a proper Redux store with initial state
11
+ const createMockStore = (initialState) => {
12
+ const rootReducer = (state = initialState) => state;
13
+ return createStore(rootReducer, initialState);
14
+ };
10
15
 
11
16
  window.getSelection = () => null;
12
17
 
13
- global.__SERVER__ = true; // eslint-disable-line no-underscore-dangle
14
- global.__CLIENT__ = false; // eslint-disable-line no-underscore-dangle
18
+ global.__SERVER__ = true;
19
+ global.__CLIENT__ = false;
15
20
 
16
21
  beforeAll(() => {
17
22
  config.widgets = {
@@ -60,7 +65,18 @@ beforeAll(() => {
60
65
 
61
66
  describe('TextBlockEdit', () => {
62
67
  it('renders w/o errors', async () => {
63
- const store = mockStore({
68
+ const store = createMockStore({
69
+ userSession: {
70
+ token: null,
71
+ },
72
+ users: {
73
+ user: {},
74
+ get: {
75
+ loading: false,
76
+ loaded: false,
77
+ error: null,
78
+ },
79
+ },
64
80
  intl: {
65
81
  locale: 'en',
66
82
  messages: {},
@@ -69,36 +85,37 @@ describe('TextBlockEdit', () => {
69
85
 
70
86
  mockAllIsIntersecting(true);
71
87
 
72
- // TODO: also test for the initial contents: My first paragraph.
73
88
  const { asFragment } = render(
74
89
  <Provider store={store}>
75
- <TextBlockEdit
76
- block="478923"
77
- blockNode={{ current: {} }}
78
- detached={false}
79
- index={2}
80
- onAddBlock={() => {}}
81
- onChangeBlock={() => {}}
82
- onDeleteBlock={() => {}}
83
- onFocusNextBlock={() => {}}
84
- onFocusPreviousBlock={() => {}}
85
- onInsertBlock={() => {}}
86
- onMutateBlock={() => {}}
87
- onSelectBlock={() => {}}
88
- properties={{}}
89
- setSlateBlockSelection={() => {}}
90
- data={{
91
- '@type': 'slate',
92
- plaintext: '',
93
- value: [
94
- {
95
- type: 'p',
96
- children: [{ text: '' /* My first paragraph. */ }],
97
- },
98
- ],
99
- }}
100
- selected={true}
101
- />
90
+ <IntlProvider locale="en" messages={{}}>
91
+ <TextBlockEdit
92
+ block="478923"
93
+ blockNode={{ current: {} }}
94
+ detached={false}
95
+ index={2}
96
+ onAddBlock={() => {}}
97
+ onChangeBlock={() => {}}
98
+ onDeleteBlock={() => {}}
99
+ onFocusNextBlock={() => {}}
100
+ onFocusPreviousBlock={() => {}}
101
+ onInsertBlock={() => {}}
102
+ onMutateBlock={() => {}}
103
+ onSelectBlock={() => {}}
104
+ properties={{}}
105
+ setSlateBlockSelection={() => {}}
106
+ data={{
107
+ '@type': 'slate',
108
+ plaintext: '',
109
+ value: [
110
+ {
111
+ type: 'p',
112
+ children: [{ text: '' }],
113
+ },
114
+ ],
115
+ }}
116
+ selected={true}
117
+ />
118
+ </IntlProvider>
102
119
  </Provider>,
103
120
  );
104
121
 
@@ -1,6 +1,6 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`TextBlockEdit renders w/o errors 1`] = `
3
+ exports[`TextBlockEdit > renders w/o errors 1`] = `
4
4
  <DocumentFragment>
5
5
  <div
6
6
  class="text-slate-editor-inner"
@@ -13,6 +13,7 @@ exports[`TextBlockEdit renders w/o errors 1`] = `
13
13
  class="toolbar-wrapper"
14
14
  />
15
15
  <div
16
+ aria-labelledby="field-undefined"
16
17
  aria-multiline="false"
17
18
  autocapitalize="false"
18
19
  autocorrect="false"
@@ -49,13 +50,25 @@ exports[`TextBlockEdit renders w/o errors 1`] = `
49
50
  <button
50
51
  class="ui basic icon button block-add-button"
51
52
  title="Add block"
53
+ type="button"
52
54
  >
53
55
  <svg
54
56
  class="icon block-add-button"
55
57
  style="height: 24px; width: auto; fill: currentColor;"
56
- viewBox=""
57
- xmlns=""
58
- />
58
+ viewBox="0 0 36 36"
59
+ xmlns="http://www.w3.org/2000/svg"
60
+ >
61
+ <g
62
+ fill-rule="evenodd"
63
+ >
64
+ <path
65
+ d="M19 9 17 9 17 17 9 17 9 19 17 19 17 27 19 27 19 19 27 19 27 17 19 17z"
66
+ />
67
+ <path
68
+ d="M18,31 C10.832,31 5,25.168 5,18 C5,10.832 10.832,5 18,5 C25.168,5 31,10.832 31,18 C31,25.168 25.168,31 18,31 M18,3 C9.729,3 3,9.729 3,18 C3,26.271 9.729,33 18,33 C26.271,33 33,26.271 33,18 C33,9.729 26.271,3 18,3"
69
+ />
70
+ </g>
71
+ </svg>
59
72
  </button>
60
73
  </div>
61
74
  </DocumentFragment>
@@ -1,6 +1,6 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`ToolbarButton renders a toolbar button 1`] = `
3
+ exports[`ToolbarButton > renders a toolbar button 1`] = `
4
4
  <DocumentFragment>
5
5
  <div
6
6
  class="button-wrapper"
@@ -1,3 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`renders a cell component 1`] = `null`;