@ckeditor/ckeditor5-restricted-editing 41.3.1 → 41.4.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.
Files changed (178) hide show
  1. package/build/restricted-editing.js +1 -1
  2. package/dist/index-content.css +4 -0
  3. package/dist/index-editor.css +4 -0
  4. package/dist/index.css +4 -0
  5. package/dist/index.js +977 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/translations/ar.d.ts +8 -0
  8. package/dist/translations/ar.js +5 -0
  9. package/dist/translations/ar.umd.js +11 -0
  10. package/dist/translations/az.d.ts +8 -0
  11. package/dist/translations/az.js +5 -0
  12. package/dist/translations/az.umd.js +11 -0
  13. package/dist/translations/bg.d.ts +8 -0
  14. package/dist/translations/bg.js +5 -0
  15. package/dist/translations/bg.umd.js +11 -0
  16. package/dist/translations/bn.d.ts +8 -0
  17. package/dist/translations/bn.js +5 -0
  18. package/dist/translations/bn.umd.js +11 -0
  19. package/dist/translations/ca.d.ts +8 -0
  20. package/dist/translations/ca.js +5 -0
  21. package/dist/translations/ca.umd.js +11 -0
  22. package/dist/translations/cs.d.ts +8 -0
  23. package/dist/translations/cs.js +5 -0
  24. package/dist/translations/cs.umd.js +11 -0
  25. package/dist/translations/da.d.ts +8 -0
  26. package/dist/translations/da.js +5 -0
  27. package/dist/translations/da.umd.js +11 -0
  28. package/dist/translations/de-ch.d.ts +8 -0
  29. package/dist/translations/de-ch.js +5 -0
  30. package/dist/translations/de-ch.umd.js +11 -0
  31. package/dist/translations/de.d.ts +8 -0
  32. package/dist/translations/de.js +5 -0
  33. package/dist/translations/de.umd.js +11 -0
  34. package/dist/translations/el.d.ts +8 -0
  35. package/dist/translations/el.js +5 -0
  36. package/dist/translations/el.umd.js +11 -0
  37. package/dist/translations/en-au.d.ts +8 -0
  38. package/dist/translations/en-au.js +5 -0
  39. package/dist/translations/en-au.umd.js +11 -0
  40. package/dist/translations/en-gb.d.ts +8 -0
  41. package/dist/translations/en-gb.js +5 -0
  42. package/dist/translations/en-gb.umd.js +11 -0
  43. package/dist/translations/en.d.ts +8 -0
  44. package/dist/translations/en.js +5 -0
  45. package/dist/translations/en.umd.js +11 -0
  46. package/dist/translations/es.d.ts +8 -0
  47. package/dist/translations/es.js +5 -0
  48. package/dist/translations/es.umd.js +11 -0
  49. package/dist/translations/et.d.ts +8 -0
  50. package/dist/translations/et.js +5 -0
  51. package/dist/translations/et.umd.js +11 -0
  52. package/dist/translations/fa.d.ts +8 -0
  53. package/dist/translations/fa.js +5 -0
  54. package/dist/translations/fa.umd.js +11 -0
  55. package/dist/translations/fi.d.ts +8 -0
  56. package/dist/translations/fi.js +5 -0
  57. package/dist/translations/fi.umd.js +11 -0
  58. package/dist/translations/fr.d.ts +8 -0
  59. package/dist/translations/fr.js +5 -0
  60. package/dist/translations/fr.umd.js +11 -0
  61. package/dist/translations/gl.d.ts +8 -0
  62. package/dist/translations/gl.js +5 -0
  63. package/dist/translations/gl.umd.js +11 -0
  64. package/dist/translations/he.d.ts +8 -0
  65. package/dist/translations/he.js +5 -0
  66. package/dist/translations/he.umd.js +11 -0
  67. package/dist/translations/hi.d.ts +8 -0
  68. package/dist/translations/hi.js +5 -0
  69. package/dist/translations/hi.umd.js +11 -0
  70. package/dist/translations/hr.d.ts +8 -0
  71. package/dist/translations/hr.js +5 -0
  72. package/dist/translations/hr.umd.js +11 -0
  73. package/dist/translations/hu.d.ts +8 -0
  74. package/dist/translations/hu.js +5 -0
  75. package/dist/translations/hu.umd.js +11 -0
  76. package/dist/translations/id.d.ts +8 -0
  77. package/dist/translations/id.js +5 -0
  78. package/dist/translations/id.umd.js +11 -0
  79. package/dist/translations/it.d.ts +8 -0
  80. package/dist/translations/it.js +5 -0
  81. package/dist/translations/it.umd.js +11 -0
  82. package/dist/translations/ja.d.ts +8 -0
  83. package/dist/translations/ja.js +5 -0
  84. package/dist/translations/ja.umd.js +11 -0
  85. package/dist/translations/ko.d.ts +8 -0
  86. package/dist/translations/ko.js +5 -0
  87. package/dist/translations/ko.umd.js +11 -0
  88. package/dist/translations/ku.d.ts +8 -0
  89. package/dist/translations/ku.js +5 -0
  90. package/dist/translations/ku.umd.js +11 -0
  91. package/dist/translations/lt.d.ts +8 -0
  92. package/dist/translations/lt.js +5 -0
  93. package/dist/translations/lt.umd.js +11 -0
  94. package/dist/translations/lv.d.ts +8 -0
  95. package/dist/translations/lv.js +5 -0
  96. package/dist/translations/lv.umd.js +11 -0
  97. package/dist/translations/ms.d.ts +8 -0
  98. package/dist/translations/ms.js +5 -0
  99. package/dist/translations/ms.umd.js +11 -0
  100. package/dist/translations/nl.d.ts +8 -0
  101. package/dist/translations/nl.js +5 -0
  102. package/dist/translations/nl.umd.js +11 -0
  103. package/dist/translations/no.d.ts +8 -0
  104. package/dist/translations/no.js +5 -0
  105. package/dist/translations/no.umd.js +11 -0
  106. package/dist/translations/pl.d.ts +8 -0
  107. package/dist/translations/pl.js +5 -0
  108. package/dist/translations/pl.umd.js +11 -0
  109. package/dist/translations/pt-br.d.ts +8 -0
  110. package/dist/translations/pt-br.js +5 -0
  111. package/dist/translations/pt-br.umd.js +11 -0
  112. package/dist/translations/pt.d.ts +8 -0
  113. package/dist/translations/pt.js +5 -0
  114. package/dist/translations/pt.umd.js +11 -0
  115. package/dist/translations/ro.d.ts +8 -0
  116. package/dist/translations/ro.js +5 -0
  117. package/dist/translations/ro.umd.js +11 -0
  118. package/dist/translations/ru.d.ts +8 -0
  119. package/dist/translations/ru.js +5 -0
  120. package/dist/translations/ru.umd.js +11 -0
  121. package/dist/translations/sk.d.ts +8 -0
  122. package/dist/translations/sk.js +5 -0
  123. package/dist/translations/sk.umd.js +11 -0
  124. package/dist/translations/sq.d.ts +8 -0
  125. package/dist/translations/sq.js +5 -0
  126. package/dist/translations/sq.umd.js +11 -0
  127. package/dist/translations/sr-latn.d.ts +8 -0
  128. package/dist/translations/sr-latn.js +5 -0
  129. package/dist/translations/sr-latn.umd.js +11 -0
  130. package/dist/translations/sr.d.ts +8 -0
  131. package/dist/translations/sr.js +5 -0
  132. package/dist/translations/sr.umd.js +11 -0
  133. package/dist/translations/sv.d.ts +8 -0
  134. package/dist/translations/sv.js +5 -0
  135. package/dist/translations/sv.umd.js +11 -0
  136. package/dist/translations/th.d.ts +8 -0
  137. package/dist/translations/th.js +5 -0
  138. package/dist/translations/th.umd.js +11 -0
  139. package/dist/translations/tk.d.ts +8 -0
  140. package/dist/translations/tk.js +5 -0
  141. package/dist/translations/tk.umd.js +11 -0
  142. package/dist/translations/tr.d.ts +8 -0
  143. package/dist/translations/tr.js +5 -0
  144. package/dist/translations/tr.umd.js +11 -0
  145. package/dist/translations/uk.d.ts +8 -0
  146. package/dist/translations/uk.js +5 -0
  147. package/dist/translations/uk.umd.js +11 -0
  148. package/dist/translations/ur.d.ts +8 -0
  149. package/dist/translations/ur.js +5 -0
  150. package/dist/translations/ur.umd.js +11 -0
  151. package/dist/translations/uz.d.ts +8 -0
  152. package/dist/translations/uz.js +5 -0
  153. package/dist/translations/uz.umd.js +11 -0
  154. package/dist/translations/vi.d.ts +8 -0
  155. package/dist/translations/vi.js +5 -0
  156. package/dist/translations/vi.umd.js +11 -0
  157. package/dist/translations/zh-cn.d.ts +8 -0
  158. package/dist/translations/zh-cn.js +5 -0
  159. package/dist/translations/zh-cn.umd.js +11 -0
  160. package/dist/translations/zh.d.ts +8 -0
  161. package/dist/translations/zh.js +5 -0
  162. package/dist/translations/zh.umd.js +11 -0
  163. package/dist/types/augmentation.d.ts +33 -0
  164. package/dist/types/index.d.ts +21 -0
  165. package/dist/types/restrictededitingconfig.d.ts +64 -0
  166. package/dist/types/restrictededitingexceptioncommand.d.ts +34 -0
  167. package/dist/types/restrictededitingmode/converters.d.ts +43 -0
  168. package/dist/types/restrictededitingmode/utils.d.ts +34 -0
  169. package/dist/types/restrictededitingmode.d.ts +33 -0
  170. package/dist/types/restrictededitingmodeediting.d.ts +87 -0
  171. package/dist/types/restrictededitingmodenavigationcommand.d.ts +46 -0
  172. package/dist/types/restrictededitingmodeui.d.ts +46 -0
  173. package/dist/types/standardeditingmode.d.ts +30 -0
  174. package/dist/types/standardeditingmodeediting.d.ts +29 -0
  175. package/dist/types/standardeditingmodeui.d.ts +31 -0
  176. package/package.json +3 -2
  177. package/src/restrictededitingmodeediting.js +51 -18
  178. package/src/restrictededitingmodeui.js +4 -1
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
7
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
8
+ */
9
+ /**
10
+ * @module restricted-editing/restrictededitingmodeediting
11
+ */
12
+ import { Plugin, type Editor } from 'ckeditor5/src/core.js';
13
+ /**
14
+ * The restricted editing mode editing feature.
15
+ *
16
+ * * It introduces the exception marker group that renders to `<span>` elements with the `restricted-editing-exception` CSS class.
17
+ * * It registers the `'goToPreviousRestrictedEditingException'` and `'goToNextRestrictedEditingException'` commands.
18
+ * * It also enables highlighting exception markers that are selected.
19
+ */
20
+ export default class RestrictedEditingModeEditing extends Plugin {
21
+ /**
22
+ * Command names that are enabled outside the non-restricted regions.
23
+ */
24
+ private _alwaysEnabled;
25
+ /**
26
+ * Commands allowed in non-restricted areas.
27
+ *
28
+ * Commands always enabled combine typing feature commands: `'input'`, `'insertText'`, `'delete'`, and `'deleteForward'` with
29
+ * commands defined in the feature configuration.
30
+ */
31
+ private _allowedInException;
32
+ /**
33
+ * @inheritDoc
34
+ */
35
+ static get pluginName(): "RestrictedEditingModeEditing";
36
+ /**
37
+ * @inheritDoc
38
+ */
39
+ constructor(editor: Editor);
40
+ /**
41
+ * @inheritDoc
42
+ */
43
+ init(): void;
44
+ /**
45
+ * Makes the given command always enabled in the restricted editing mode (regardless
46
+ * of selection location).
47
+ *
48
+ * To enable some commands in non-restricted areas of the content use
49
+ * {@link module:restricted-editing/restrictededitingconfig~RestrictedEditingConfig#allowedCommands} configuration option.
50
+ *
51
+ * @param commandName Name of the command to enable.
52
+ */
53
+ enableCommand(commandName: string): void;
54
+ /**
55
+ * Sets up the restricted mode editing conversion:
56
+ *
57
+ * * ucpast & downcast converters,
58
+ * * marker highlighting in the edting area,
59
+ * * marker post-fixers.
60
+ */
61
+ private _setupConversion;
62
+ /**
63
+ * Setups additional editing restrictions beyond command toggling:
64
+ *
65
+ * * delete content range trimming
66
+ * * disabling input command outside exception marker
67
+ * * restricting clipboard holder to text only
68
+ * * restricting text attributes in content
69
+ */
70
+ private _setupRestrictions;
71
+ /**
72
+ * Sets up the command toggling which enables or disables commands based on the user selection.
73
+ */
74
+ private _setupCommandsToggling;
75
+ /**
76
+ * Checks if commands should be enabled or disabled based on the current selection.
77
+ */
78
+ private _checkCommands;
79
+ /**
80
+ * Enables commands in non-restricted regions.
81
+ */
82
+ private _enableCommands;
83
+ /**
84
+ * Disables commands outside non-restricted regions.
85
+ */
86
+ private _disableCommands;
87
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
7
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
8
+ */
9
+ import { Command, type Editor } from 'ckeditor5/src/core.js';
10
+ /**
11
+ * The command that allows navigation across the exceptions in the edited document.
12
+ */
13
+ export default class RestrictedEditingModeNavigationCommand extends Command {
14
+ /**
15
+ * The direction of the command.
16
+ */
17
+ private _direction;
18
+ /**
19
+ * Creates an instance of the command.
20
+ *
21
+ * @param editor The editor instance.
22
+ * @param direction The direction that the command works.
23
+ */
24
+ constructor(editor: Editor, direction: RestrictedEditingModeNavigationDirection);
25
+ /**
26
+ * @inheritDoc
27
+ */
28
+ refresh(): void;
29
+ /**
30
+ * Executes the command.
31
+ *
32
+ * @fires execute
33
+ */
34
+ execute(): void;
35
+ /**
36
+ * Checks whether the command can be enabled in the current context.
37
+ *
38
+ * @returns Whether the command should be enabled.
39
+ */
40
+ private _checkEnabled;
41
+ }
42
+ /**
43
+ * Directions in which the
44
+ * {@link module:restricted-editing/restrictededitingmodenavigationcommand~RestrictedEditingModeNavigationCommand} can work.
45
+ */
46
+ export type RestrictedEditingModeNavigationDirection = 'forward' | 'backward';
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
7
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
8
+ */
9
+ /**
10
+ * @module restricted-editing/restrictededitingmodeui
11
+ */
12
+ import { Plugin } from 'ckeditor5/src/core.js';
13
+ /**
14
+ * The restricted editing mode UI feature.
15
+ *
16
+ * It introduces the `'restrictedEditing'` dropdown that offers tools to navigate between exceptions across
17
+ * the document.
18
+ */
19
+ export default class RestrictedEditingModeUI extends Plugin {
20
+ /**
21
+ * @inheritDoc
22
+ */
23
+ static get pluginName(): "RestrictedEditingModeUI";
24
+ /**
25
+ * @inheritDoc
26
+ */
27
+ init(): void;
28
+ /**
29
+ * Creates a button for restricted editing command to use in menu bar.
30
+ */
31
+ private _createMenuBarButton;
32
+ /**
33
+ * Returns a definition of the navigation button to be used in the dropdown.
34
+ *
35
+ * @param commandName The name of the command that the button represents.
36
+ * @param label The translated label of the button.
37
+ * @param keystroke The button keystroke.
38
+ */
39
+ private _getButtonDefinition;
40
+ /**
41
+ * Returns definitions for UI buttons.
42
+ *
43
+ * @internal
44
+ */
45
+ private _getButtonDefinitions;
46
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
7
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
8
+ */
9
+ /**
10
+ * @module restricted-editing/standardeditingmode
11
+ */
12
+ import { Plugin } from 'ckeditor5/src/core.js';
13
+ import StandardEditingModeEditing from './standardeditingmodeediting.js';
14
+ import StandardEditingModeUI from './standardeditingmodeui.js';
15
+ import '../theme/restrictedediting.css';
16
+ /**
17
+ * The standard editing mode plugin.
18
+ *
19
+ * This is a "glue" plugin that loads the following plugins:
20
+ *
21
+ * * The {@link module:restricted-editing/standardeditingmodeediting~StandardEditingModeEditing standard mode editing feature}.
22
+ * * The {@link module:restricted-editing/standardeditingmodeui~StandardEditingModeUI standard mode UI feature}.
23
+ */
24
+ export default class StandardEditingMode extends Plugin {
25
+ /**
26
+ * @inheritDoc
27
+ */
28
+ static get pluginName(): "StandardEditingMode";
29
+ static get requires(): readonly [typeof StandardEditingModeEditing, typeof StandardEditingModeUI];
30
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
7
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
8
+ */
9
+ /**
10
+ * @module restricted-editing/standardeditingmodeediting
11
+ */
12
+ import { Plugin } from 'ckeditor5/src/core.js';
13
+ /**
14
+ * The standard editing mode editing feature.
15
+ *
16
+ * * It introduces the `restrictedEditingException` text attribute that is rendered as
17
+ * a `<span>` element with the `restricted-editing-exception` CSS class.
18
+ * * It registers the `'restrictedEditingException'` command.
19
+ */
20
+ export default class StandardEditingModeEditing extends Plugin {
21
+ /**
22
+ * @inheritDoc
23
+ */
24
+ static get pluginName(): "StandardEditingModeEditing";
25
+ /**
26
+ * @inheritDoc
27
+ */
28
+ init(): void;
29
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
7
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
8
+ */
9
+ /**
10
+ * @module restricted-editing/standardeditingmodeui
11
+ */
12
+ import { Plugin } from 'ckeditor5/src/core.js';
13
+ /**
14
+ * The standard editing mode UI feature.
15
+ *
16
+ * It introduces the `'restrictedEditingException'` button that marks text as unrestricted for editing.
17
+ */
18
+ export default class StandardEditingModeUI extends Plugin {
19
+ /**
20
+ * @inheritDoc
21
+ */
22
+ static get pluginName(): "StandardEditingModeUI";
23
+ /**
24
+ * @inheritDoc
25
+ */
26
+ init(): void;
27
+ /**
28
+ * Creates a button for restricted editing exception command to use either in toolbar or in menu bar.
29
+ */
30
+ private _createButton;
31
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ckeditor/ckeditor5-restricted-editing",
3
- "version": "41.3.1",
3
+ "version": "41.4.0",
4
4
  "description": "Restricted editing feature for CKEditor 5 editors.",
5
5
  "keywords": [
6
6
  "ckeditor",
@@ -12,7 +12,7 @@
12
12
  "type": "module",
13
13
  "main": "src/index.js",
14
14
  "dependencies": {
15
- "ckeditor5": "41.3.1"
15
+ "ckeditor5": "41.4.0"
16
16
  },
17
17
  "author": "CKSource (http://cksource.com/)",
18
18
  "license": "GPL-2.0-or-later",
@@ -24,6 +24,7 @@
24
24
  "directory": "packages/ckeditor5-restricted-editing"
25
25
  },
26
26
  "files": [
27
+ "dist",
27
28
  "lang",
28
29
  "src/**/*.js",
29
30
  "src/**/*.d.ts",
@@ -50,8 +50,18 @@ export default class RestrictedEditingModeEditing extends Plugin {
50
50
  // Commands & keystrokes that allow navigation in the content.
51
51
  editor.commands.add('goToPreviousRestrictedEditingException', new RestrictedEditingModeNavigationCommand(editor, 'backward'));
52
52
  editor.commands.add('goToNextRestrictedEditingException', new RestrictedEditingModeNavigationCommand(editor, 'forward'));
53
- editor.keystrokes.set('Tab', getCommandExecuter(editor, 'goToNextRestrictedEditingException'));
54
- editor.keystrokes.set('Shift+Tab', getCommandExecuter(editor, 'goToPreviousRestrictedEditingException'));
53
+ this.listenTo(editingView.document, 'tab', (evt, data) => {
54
+ const commandName = !data.shiftKey ? 'goToNextRestrictedEditingException' : 'goToPreviousRestrictedEditingException';
55
+ const command = editor.commands.get(commandName);
56
+ if (command.isEnabled) {
57
+ editor.execute(commandName);
58
+ // Stop the event in the DOM: no listener in the web page will be triggered by this event.
59
+ data.preventDefault();
60
+ data.stopPropagation();
61
+ }
62
+ // Stop the event bubbling in the editor: no more callbacks will be executed for this keystroke.
63
+ evt.stop();
64
+ }, { context: '$capture' });
55
65
  editor.keystrokes.set('Ctrl+A', getSelectAllHandler(editor));
56
66
  editingView.change(writer => {
57
67
  for (const root of editingView.document.roots) {
@@ -98,8 +108,43 @@ export default class RestrictedEditingModeEditing extends Plugin {
98
108
  }
99
109
  }));
100
110
  // Currently the marker helpers are tied to other use-cases and do not render a collapsed marker as highlight.
101
- // That's why there are 2 downcast converters for them:
102
- // 1. The default marker-to-highlight will wrap selected text with `<span>`.
111
+ // Also, markerToHighlight can not convert marker on an inline object. It handles only text and widgets,
112
+ // but it is not a case in the data pipeline. That's why there are 3 downcast converters for them:
113
+ //
114
+ // 1. The custom inline item (text or inline object) converter (but not the selection).
115
+ editor.conversion.for('downcast').add(dispatcher => {
116
+ dispatcher.on('addMarker:restrictedEditingException', (evt, data, conversionApi) => {
117
+ // Only convert per-item conversion.
118
+ if (!data.item) {
119
+ return;
120
+ }
121
+ // Do not convert the selection or non-inline items.
122
+ if (data.item.is('selection') || !conversionApi.schema.isInline(data.item)) {
123
+ return;
124
+ }
125
+ if (!conversionApi.consumable.consume(data.item, evt.name)) {
126
+ return;
127
+ }
128
+ const viewWriter = conversionApi.writer;
129
+ const viewElement = viewWriter.createAttributeElement('span', {
130
+ class: 'restricted-editing-exception'
131
+ }, {
132
+ id: data.markerName,
133
+ priority: -10
134
+ });
135
+ const viewRange = conversionApi.mapper.toViewRange(data.range);
136
+ const rangeAfterWrap = viewWriter.wrap(viewRange, viewElement);
137
+ for (const element of rangeAfterWrap.getItems()) {
138
+ if (element.is('attributeElement') && element.isSimilar(viewElement)) {
139
+ conversionApi.mapper.bindElementToMarker(element, data.markerName);
140
+ // One attribute element is enough, because all of them are bound together by the view writer.
141
+ // Mapper uses this binding to get all the elements no matter how many of them are registered in the mapper.
142
+ break;
143
+ }
144
+ }
145
+ });
146
+ });
147
+ // 2. The marker-to-highlight converter for the document selection.
103
148
  editor.conversion.for('downcast').markerToHighlight({
104
149
  model: 'restrictedEditingException',
105
150
  // Use callback to return new object every time new marker instance is created - otherwise it will be seen as the same marker.
@@ -111,8 +156,8 @@ export default class RestrictedEditingModeEditing extends Plugin {
111
156
  };
112
157
  }
113
158
  });
114
- // 2. But for collapsed marker we need to render it as an element.
115
- // Additionally the editing pipeline should always display a collapsed marker.
159
+ // 3. And for collapsed marker we need to render it as an element.
160
+ // Additionally, the editing pipeline should always display a collapsed marker.
116
161
  editor.conversion.for('editingDowncast').markerToElement({
117
162
  model: 'restrictedEditingException',
118
163
  view: (markerData, { writer }) => {
@@ -231,18 +276,6 @@ export default class RestrictedEditingModeEditing extends Plugin {
231
276
  }
232
277
  }
233
278
  }
234
- /**
235
- * Helper method for executing enabled commands only.
236
- */
237
- function getCommandExecuter(editor, commandName) {
238
- return (_, cancel) => {
239
- const command = editor.commands.get(commandName);
240
- if (command.isEnabled) {
241
- editor.execute(commandName);
242
- cancel();
243
- }
244
- };
245
- }
246
279
  /**
247
280
  * Helper for handling Ctrl+A keydown behaviour.
248
281
  */
@@ -34,7 +34,9 @@ export default class RestrictedEditingModeUI extends Plugin {
34
34
  this._getButtonDefinitions().forEach(({ commandName, label, keystroke }) => {
35
35
  listItems.add(this._getButtonDefinition(commandName, label, keystroke));
36
36
  });
37
- addListToDropdown(dropdownView, listItems);
37
+ addListToDropdown(dropdownView, listItems, {
38
+ role: 'menu'
39
+ });
38
40
  dropdownView.buttonView.set({
39
41
  label: t('Navigate editable regions'),
40
42
  icon: lockIcon,
@@ -109,6 +111,7 @@ export default class RestrictedEditingModeUI extends Plugin {
109
111
  withText: true,
110
112
  keystroke,
111
113
  withKeystroke: true,
114
+ role: 'menuitem',
112
115
  _commandName: commandName
113
116
  })
114
117
  };