Skip to content

Commit 6652bad

Browse files
authored
Merge branch 'main' into fixdepsversion
2 parents 32efe73 + 7cdcabd commit 6652bad

File tree

10 files changed

+120
-6
lines changed

10 files changed

+120
-6
lines changed

packages/volto-slate/news/6570.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
In `RichTextWidget` and `HtmlSlateWidget`, fix breaking a list by typing Enter. @nileshgulia1
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { Editor, Range, Transforms } from 'slate';
2+
3+
import config from '@plone/volto/registry';
4+
import { isCursorAtBlockEnd } from '@plone/volto-slate/utils/selection';
5+
import { getCurrentListItem } from '@plone/volto-slate/utils/lists';
6+
import { createEmptyParagraph } from '@plone/volto-slate/utils/blocks';
7+
8+
export const breakListInWidget = (editor) => {
9+
const { insertBreak } = editor;
10+
11+
editor.insertBreak = () => {
12+
if (!(editor.selection && Range.isCollapsed(editor.selection))) {
13+
insertBreak();
14+
return false;
15+
}
16+
17+
const { slate } = config.settings;
18+
const { anchor } = editor.selection;
19+
20+
const ref = Editor.rangeRef(editor, editor.selection, {
21+
affinity: 'inward',
22+
});
23+
24+
const [listItem, listItemPath] = getCurrentListItem(editor);
25+
if (listItem) {
26+
if (Editor.string(editor, listItemPath)) {
27+
Transforms.splitNodes(editor, {
28+
at: editor.selection,
29+
match: (node) => node.type === slate.listItemType,
30+
always: true,
31+
});
32+
33+
return true;
34+
}
35+
}
36+
37+
const [parent] = Editor.parent(editor, anchor.path);
38+
39+
if (parent.type !== slate.listItemType || anchor.offset > 0) {
40+
insertBreak();
41+
return;
42+
}
43+
44+
Editor.deleteBackward(editor, { unit: 'line' });
45+
// also account for empty nodes [{text: ''}]
46+
if (Editor.isEmpty(editor, parent)) {
47+
Transforms.removeNodes(editor, { at: ref.current });
48+
49+
Transforms.insertNodes(editor, createEmptyParagraph(), {
50+
at: [editor.children.length],
51+
});
52+
Transforms.select(editor, Editor.end(editor, []));
53+
54+
return true;
55+
}
56+
57+
Transforms.removeNodes(editor, { at: ref.current });
58+
59+
if (isCursorAtBlockEnd(editor)) {
60+
Editor.insertNode(editor, createEmptyParagraph());
61+
return true;
62+
}
63+
return true;
64+
};
65+
66+
return editor;
67+
};

packages/volto-slate/src/blocks/Text/extensions/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ export * from './breakList';
44
export * from './withLists';
55
export * from './isSelected';
66
export * from './normalizeExternalData';
7+
export * from './breakListInWidget';

packages/volto-slate/src/blocks/Text/index.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
import { withDeleteSelectionOnEnter } from '@plone/volto-slate/editor/extensions';
2323
import {
2424
breakList,
25+
breakListInWidget,
2526
withDeserializers,
2627
withLists,
2728
withSplitBlocksOnBreak,
@@ -47,6 +48,7 @@ export default function applyConfig(config) {
4748
breakList,
4849
normalizeExternalData,
4950
],
51+
slateWidgetExtensions: [breakListInWidget],
5052

5153
// Pluggable handlers for the onKeyDown event of <Editable />
5254
// Order matters here. A handler can return `true` to stop executing any

packages/volto-slate/src/widgets/HtmlSlateWidget.jsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@ import { defineMessages, injectIntl } from 'react-intl';
1212
import { FormFieldWrapper } from '@plone/volto/components/manage/Widgets';
1313
import SlateEditor from '@plone/volto-slate/editor/SlateEditor';
1414
import { serializeNodes } from '@plone/volto-slate/editor/render';
15+
import { handleKeyDetached } from '@plone/volto-slate/blocks/Text/keyboard';
1516
import { makeEditor } from '@plone/volto-slate/utils/editor';
1617
import deserialize from '@plone/volto-slate/editor/deserialize';
1718

1819
import {
1920
createEmptyParagraph,
2021
normalizeExternalData,
2122
} from '@plone/volto-slate/utils';
23+
import config from '@plone/volto/registry';
24+
2225
import { ErrorBoundary } from './ErrorBoundary';
2326

2427
import './style.css';
@@ -44,6 +47,8 @@ const HtmlSlateWidget = (props) => {
4447
intl,
4548
} = props;
4649

50+
const { slateWidgetExtensions } = config.settings.slate;
51+
4752
const [selected, setSelected] = React.useState(focus);
4853

4954
const editor = React.useMemo(() => makeEditor(), []);
@@ -127,7 +132,10 @@ const HtmlSlateWidget = (props) => {
127132
block={block}
128133
selected={selected}
129134
properties={properties}
135+
extensions={slateWidgetExtensions}
136+
onKeyDown={handleKeyDetached}
130137
placeholder={placeholder}
138+
editableProps={{ 'aria-multiline': 'true' }}
131139
/>
132140
</ErrorBoundary>
133141
</div>

packages/volto-slate/src/widgets/RichTextWidget.jsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import React from 'react';
77
import isUndefined from 'lodash/isUndefined';
88
import isString from 'lodash/isString';
99
import { FormFieldWrapper } from '@plone/volto/components/manage/Widgets';
10+
import { handleKeyDetached } from '@plone/volto-slate/blocks/Text/keyboard';
1011
import SlateEditor from '@plone/volto-slate/editor/SlateEditor';
12+
import config from '@plone/volto/registry';
1113

1214
import { createEmptyParagraph, createParagraph } from '../utils/blocks';
1315

@@ -37,6 +39,7 @@ const SlateRichTextWidget = (props) => {
3739
readOnly = false,
3840
} = props;
3941
const [selected, setSelected] = React.useState(focus);
42+
const { slateWidgetExtensions } = config.settings.slate;
4043

4144
return (
4245
<FormFieldWrapper {...props} draggable={false} className="slate_wysiwyg">
@@ -62,7 +65,10 @@ const SlateRichTextWidget = (props) => {
6265
block={block}
6366
selected={selected}
6467
properties={properties}
68+
extensions={slateWidgetExtensions}
69+
onKeyDown={handleKeyDetached}
6570
placeholder={placeholder}
71+
editableProps={{ 'aria-multiline': 'true' }}
6672
/>
6773
</div>
6874
</FormFieldWrapper>

packages/volto/cypress/tests/coresandbox/fields.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,33 @@ context('Special fields Acceptance Tests', () => {
105105
'<p> hello world </p>',
106106
);
107107
});
108+
109+
it('break list on empty li element', () => {
110+
cy.intercept('PATCH', '/**/document').as('save');
111+
cy.getSlate().click();
112+
cy.get('.button .block-add-button').click({ force: true });
113+
cy.get('.blocks-chooser .mostUsed .button.testBlock').click();
114+
cy.get('#fieldset-default-field-label-html').click();
115+
cy.get('.slate_wysiwyg_box [contenteditable=true]')
116+
.type('hello welcome to plone')
117+
.scrollIntoView();
118+
119+
cy.setSlateSelection('hello');
120+
121+
cy.wait(1000); // th
122+
cy.get('.slate-inline-toolbar').should('be.visible');
123+
cy.clickSlateButton('Bulleted list');
124+
cy.get('.slate_wysiwyg_box [contenteditable=true]').should(
125+
'have.descendants',
126+
'ul li',
127+
);
128+
cy.setSlateCursor('plone').type('{enter}').type('{enter}');
129+
130+
cy.get('#toolbar-save').click();
131+
cy.wait('@save');
132+
133+
cy.get('.test-block').should('contain.text', '<p></p>');
134+
});
108135
});
109136

110137
describe('ObjectListWidget', () => {

packages/volto/locales/nl/LC_MESSAGES/volto.po

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,7 @@ msgstr "Wijzigingen zijn opgeslagen."
628628
#. Default: "Check this box to customize the title, description, or image of the target content item for this teaser. Leave it unchecked to show updates to the target content item if it is edited later."
629629
#: components/manage/Blocks/Teaser/schema
630630
msgid "Check this box to customize the title, description, or image of the target content item for this teaser. Leave it unchecked to show updates to the target content item if it is edited later."
631-
msgstr "Vink dit vakje aan om titel, beschrijving of afbeelding van een doel inhoudsitem voor dit voorproefje te wijzigen. Laat het uitgevinkt om updates te tonen voor het doel inhoudsitem indien het later bewerkt zou worden."
631+
msgstr "Vink dit vakje aan om titel, beschrijving of afbeelding van een doel inhoudsitem voor deze teaser te wijzigen. Laat het uitgevinkt om updates te tonen voor het doel inhoudsitem indien het later bewerkt zou worden."
632632

633633
#. Default: "Checkbox"
634634
#: components/manage/Widgets/SchemaWidget
@@ -923,7 +923,7 @@ msgstr "Huidig wachtwoord"
923923
#. Default: "Customize teaser content"
924924
#: components/manage/Blocks/Teaser/schema
925925
msgid "Customize teaser content"
926-
msgstr "Wijzig inhoud voorproefje"
926+
msgstr "Wijzig inhoud teaser"
927927

928928
#. Default: "Cut"
929929
#: components/manage/Actions/Actions
@@ -1649,7 +1649,7 @@ msgstr "Google Maps insluit blok"
16491649
#. Default: "Grid"
16501650
#: components/manage/Blocks/Grid/schema
16511651
msgid "Grid"
1652-
msgstr "Rooster"
1652+
msgstr "Grid"
16531653

16541654
#. Default: "Group"
16551655
#: components/manage/Sharing/Sharing
@@ -1922,7 +1922,7 @@ msgstr "Ongeldig blok - wordt verwijderd bij opslaan"
19221922
#. Default: "Invalid teaser source"
19231923
#: components/manage/Blocks/Teaser/Data
19241924
msgid "Invalid teaser source"
1925-
msgstr "Ongeldige bron voorproefje"
1925+
msgstr "Ongeldige bron teaser"
19261926

19271927
#. Default: "It is not allowed to define both the password and to request sending the password reset message by e-mail. You need to select one of them."
19281928
#: helpers/MessageLabels/MessageLabels
@@ -3020,7 +3020,7 @@ msgstr "Resultaten limiet"
30203020
#. Default: "Results preview"
30213021
#: components/manage/Blocks/Listing/Edit
30223022
msgid "Results preview"
3023-
msgstr "Resultaten voorproefje"
3023+
msgstr "Resultaten voorvertoning"
30243024

30253025
#. Default: "Results template"
30263026
#: components/manage/Blocks/Search/SearchBlockEdit
@@ -3686,7 +3686,7 @@ msgstr "Doel aantal objecten in geheugen per cache"
36863686
#. Default: "Teaser"
36873687
#: components/manage/Blocks/Teaser/schema
36883688
msgid "Teaser"
3689-
msgstr "Voorproefje"
3689+
msgstr "teaser"
36903690

36913691
#. Default: "Text"
36923692
#: components/manage/Widgets/SchemaWidget

packages/volto/news/6476.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Update Dutch translations. @mauritsvanrees

packages/volto/news/6570.internal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Test(cypress): fix breaking a list by typing Enter refs- #6586 @nileshgulia1

0 commit comments

Comments
 (0)