@pie-lib/editable-html-tip-tap 1.0.2 → 1.0.4

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 (165) hide show
  1. package/lib/components/CharacterPicker.js +221 -0
  2. package/lib/components/CharacterPicker.js.map +1 -0
  3. package/lib/components/EditableHtml.js +323 -0
  4. package/lib/components/EditableHtml.js.map +1 -0
  5. package/lib/components/MenuBar.js +694 -0
  6. package/lib/components/MenuBar.js.map +1 -0
  7. package/lib/components/TiptapContainer.js +90 -0
  8. package/lib/components/TiptapContainer.js.map +1 -0
  9. package/lib/components/buttons/done-button.js +53 -0
  10. package/lib/components/characters/characterUtils.js +112 -0
  11. package/lib/components/characters/characterUtils.js.map +1 -0
  12. package/lib/components/characters/custom-popper.js +73 -0
  13. package/lib/components/characters/custom-popper.js.map +1 -0
  14. package/lib/components/common/done-button.js +53 -0
  15. package/lib/components/common/done-button.js.map +1 -0
  16. package/lib/components/common/toolbar-buttons.js +194 -0
  17. package/lib/components/icons/CssIcon.js +37 -0
  18. package/lib/components/icons/CssIcon.js.map +1 -0
  19. package/lib/components/icons/RespArea.js +95 -0
  20. package/lib/components/icons/RespArea.js.map +1 -0
  21. package/lib/components/icons/TableIcons.js +69 -0
  22. package/lib/components/icons/TableIcons.js.map +1 -0
  23. package/lib/components/icons/TextAlign.js +194 -0
  24. package/lib/components/icons/TextAlign.js.map +1 -0
  25. package/lib/components/icons/index.js +194 -0
  26. package/lib/components/image/AltDialog.js +129 -0
  27. package/lib/components/image/ImageToolbar.js +177 -0
  28. package/lib/components/image/ImageToolbar.js.map +1 -0
  29. package/lib/components/image/InsertImageHandler.js +115 -0
  30. package/lib/components/image/InsertImageHandler.js.map +1 -0
  31. package/lib/components/image/alt-dialog.js +2 -0
  32. package/lib/components/media/MediaDialog.js +709 -0
  33. package/lib/components/media/MediaDialog.js.map +1 -0
  34. package/lib/components/media/MediaToolbar.js +101 -0
  35. package/lib/components/media/MediaToolbar.js.map +1 -0
  36. package/lib/components/media/MediaWrapper.js +93 -0
  37. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js +94 -0
  38. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js.map +1 -0
  39. package/lib/components/respArea/DragInTheBlank/choice.js +289 -0
  40. package/lib/components/respArea/DragInTheBlank/choice.js.map +1 -0
  41. package/lib/components/respArea/DragInTheBlank.js +94 -0
  42. package/lib/components/respArea/ExplicitConstructedResponse.js +120 -0
  43. package/lib/components/respArea/ExplicitConstructedResponse.js.map +1 -0
  44. package/lib/components/respArea/InlineDropdown.js +126 -0
  45. package/lib/components/respArea/InlineDropdown.js.map +1 -0
  46. package/lib/components/respArea/ToolbarIcon.js +105 -0
  47. package/lib/components/respArea/ToolbarIcon.js.map +1 -0
  48. package/lib/components/respArea/choice.js +2 -0
  49. package/lib/constants.js.map +1 -0
  50. package/lib/extensions/component.js +5 -5
  51. package/lib/extensions/component.js.map +1 -0
  52. package/lib/extensions/css.js.map +1 -0
  53. package/lib/extensions/custom-toolbar-wrapper.js +2 -4
  54. package/lib/extensions/custom-toolbar-wrapper.js.map +1 -0
  55. package/lib/extensions/extended-table.js +30 -0
  56. package/lib/extensions/extended-table.js.map +1 -0
  57. package/lib/extensions/image.js +2 -8
  58. package/lib/extensions/image.js.map +1 -0
  59. package/lib/extensions/index.js +52 -0
  60. package/lib/extensions/index.js.map +1 -0
  61. package/lib/extensions/math.js.map +1 -0
  62. package/lib/extensions/media.js +7 -7
  63. package/lib/extensions/media.js.map +1 -0
  64. package/lib/extensions/responseArea.js +7 -7
  65. package/lib/extensions/responseArea.js.map +1 -0
  66. package/lib/index.js +16 -1481
  67. package/lib/index.js.map +1 -0
  68. package/lib/plugins/index.js +8 -80
  69. package/lib/styles/editorContainerStyles.js +200 -0
  70. package/lib/styles/editorContainerStyles.js.map +1 -0
  71. package/lib/theme.js.map +1 -0
  72. package/lib/utils/size.js +34 -0
  73. package/lib/utils/size.js.map +1 -0
  74. package/package.json +1 -1
  75. package/src/components/CharacterPicker.jsx +185 -0
  76. package/src/components/EditableHtml.jsx +306 -0
  77. package/src/components/MenuBar.jsx +630 -0
  78. package/src/components/TiptapContainer.jsx +96 -0
  79. package/src/components/characters/characterUtils.js +127 -0
  80. package/src/{plugins/image/image-toolbar.jsx → components/image/ImageToolbar.jsx} +2 -2
  81. package/src/{plugins/image/insert-image-handler.js → components/image/InsertImageHandler.js} +0 -1
  82. package/src/{plugins/media/media-dialog.js → components/media/MediaDialog.js} +2 -2
  83. package/src/{plugins/respArea/drag-in-the-blank → components/respArea/DragInTheBlank}/choice.jsx +1 -1
  84. package/src/{plugins/respArea/inline-dropdown/index.jsx → components/respArea/InlineDropdown.jsx} +1 -1
  85. package/src/components/respArea/ToolbarIcon.jsx +68 -0
  86. package/src/extensions/component.jsx +2 -2
  87. package/src/extensions/custom-toolbar-wrapper.jsx +6 -7
  88. package/src/extensions/extended-table.js +27 -0
  89. package/src/extensions/image.js +2 -2
  90. package/src/extensions/index.js +76 -0
  91. package/src/extensions/media.js +12 -7
  92. package/src/extensions/responseArea.js +7 -7
  93. package/src/index.jsx +3 -1440
  94. package/src/styles/editorContainerStyles.js +203 -0
  95. package/src/utils/size.js +32 -0
  96. package/src/__tests__/editor.test.jsx +0 -363
  97. package/src/__tests__/serialization.test.js +0 -291
  98. package/src/block-tags.js +0 -17
  99. package/src/editor.jsx +0 -1197
  100. package/src/extensions/characters.js +0 -46
  101. package/src/old-index.jsx +0 -162
  102. package/src/parse-html.js +0 -8
  103. package/src/plugins/README.md +0 -27
  104. package/src/plugins/characters/index.jsx +0 -284
  105. package/src/plugins/characters/utils.js +0 -447
  106. package/src/plugins/css/index.jsx +0 -340
  107. package/src/plugins/customPlugin/index.jsx +0 -85
  108. package/src/plugins/html/icons/index.jsx +0 -19
  109. package/src/plugins/html/index.jsx +0 -72
  110. package/src/plugins/image/__tests__/__snapshots__/component.test.jsx.snap +0 -51
  111. package/src/plugins/image/__tests__/__snapshots__/image-toolbar-logic.test.jsx.snap +0 -27
  112. package/src/plugins/image/__tests__/__snapshots__/image-toolbar.test.jsx.snap +0 -44
  113. package/src/plugins/image/__tests__/component.test.jsx +0 -41
  114. package/src/plugins/image/__tests__/image-toolbar-logic.test.jsx +0 -42
  115. package/src/plugins/image/__tests__/image-toolbar.test.jsx +0 -11
  116. package/src/plugins/image/__tests__/index.test.js +0 -95
  117. package/src/plugins/image/__tests__/insert-image-handler.test.js +0 -113
  118. package/src/plugins/image/__tests__/mock-change.js +0 -15
  119. package/src/plugins/image/component.jsx +0 -343
  120. package/src/plugins/image/index.jsx +0 -227
  121. package/src/plugins/index.jsx +0 -377
  122. package/src/plugins/list/__tests__/index.test.js +0 -54
  123. package/src/plugins/list/index.jsx +0 -305
  124. package/src/plugins/math/__tests__/__snapshots__/index.test.jsx.snap +0 -48
  125. package/src/plugins/math/__tests__/index.test.jsx +0 -245
  126. package/src/plugins/math/index.jsx +0 -379
  127. package/src/plugins/media/__tests__/index.test.js +0 -75
  128. package/src/plugins/media/index.jsx +0 -325
  129. package/src/plugins/rendering/index.js +0 -31
  130. package/src/plugins/respArea/index.jsx +0 -299
  131. package/src/plugins/respArea/math-templated/index.jsx +0 -104
  132. package/src/plugins/respArea/utils.jsx +0 -90
  133. package/src/plugins/table/CustomTablePlugin.js +0 -113
  134. package/src/plugins/table/__tests__/__snapshots__/table-toolbar.test.jsx.snap +0 -44
  135. package/src/plugins/table/__tests__/index.test.jsx +0 -401
  136. package/src/plugins/table/__tests__/table-toolbar.test.jsx +0 -42
  137. package/src/plugins/table/index.jsx +0 -427
  138. package/src/plugins/table/table-toolbar.jsx +0 -136
  139. package/src/plugins/textAlign/index.jsx +0 -23
  140. package/src/plugins/toolbar/__tests__/__snapshots__/default-toolbar.test.jsx.snap +0 -923
  141. package/src/plugins/toolbar/__tests__/__snapshots__/editor-and-toolbar.test.jsx.snap +0 -20
  142. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar-buttons.test.jsx.snap +0 -36
  143. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar.test.jsx.snap +0 -46
  144. package/src/plugins/toolbar/__tests__/default-toolbar.test.jsx +0 -94
  145. package/src/plugins/toolbar/__tests__/editor-and-toolbar.test.jsx +0 -37
  146. package/src/plugins/toolbar/__tests__/toolbar-buttons.test.jsx +0 -51
  147. package/src/plugins/toolbar/__tests__/toolbar.test.jsx +0 -106
  148. package/src/plugins/toolbar/default-toolbar.jsx +0 -206
  149. package/src/plugins/toolbar/editor-and-toolbar.jsx +0 -257
  150. package/src/plugins/toolbar/index.jsx +0 -23
  151. package/src/plugins/toolbar/toolbar.jsx +0 -338
  152. package/src/plugins/utils.js +0 -31
  153. package/src/serialization.jsx +0 -621
  154. /package/src/{plugins → components}/characters/custom-popper.js +0 -0
  155. /package/src/{plugins/toolbar → components/common}/done-button.jsx +0 -0
  156. /package/src/{plugins/toolbar → components/common}/toolbar-buttons.jsx +0 -0
  157. /package/src/{plugins/css/icons/index.jsx → components/icons/CssIcon.jsx} +0 -0
  158. /package/src/{plugins/respArea/icons/index.jsx → components/icons/RespArea.jsx} +0 -0
  159. /package/src/{plugins/table/icons/index.jsx → components/icons/TableIcons.jsx} +0 -0
  160. /package/src/{plugins/textAlign/icons/index.jsx → components/icons/TextAlign.jsx} +0 -0
  161. /package/src/{plugins/image/alt-dialog.jsx → components/image/AltDialog.jsx} +0 -0
  162. /package/src/{plugins/media/media-toolbar.jsx → components/media/MediaToolbar.jsx} +0 -0
  163. /package/src/{plugins/media/media-wrapper.jsx → components/media/MediaWrapper.jsx} +0 -0
  164. /package/src/{plugins/respArea/drag-in-the-blank/index.jsx → components/respArea/DragInTheBlank/DragInTheBlank.jsx} +0 -0
  165. /package/src/{plugins/respArea/explicit-constructed-response/index.jsx → components/respArea/ExplicitConstructedResponse.jsx} +0 -0
@@ -1,20 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`toolbar renders 1`] = `
4
- <div
5
- className="root"
6
- >
7
- <div
8
- className="editorHolder editorInFocus"
9
- >
10
- <div
11
- className=""
12
- >
13
- children
14
- </div>
15
- </div>
16
- <div>
17
- ---- toolbar ------
18
- </div>
19
- </div>
20
- `;
@@ -1,36 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`Button renders 1`] = `
4
- <button
5
- className=""
6
- onKeyDown={[Function]}
7
- onMouseDown={[Function]}
8
- tabIndex={0}
9
- >
10
- children
11
- </button>
12
- `;
13
-
14
- exports[`MarkButton renders active 1`] = `
15
- <button
16
- aria-pressed={true}
17
- className="button active"
18
- onKeyDown={[Function]}
19
- onMouseDown={[Function]}
20
- tabIndex={0}
21
- >
22
- children
23
- </button>
24
- `;
25
-
26
- exports[`MarkButton renders not active 1`] = `
27
- <button
28
- aria-pressed={false}
29
- className="button"
30
- onKeyDown={[Function]}
31
- onMouseDown={[Function]}
32
- tabIndex={0}
33
- >
34
- children
35
- </button>
36
- `;
@@ -1,46 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`toolbar default renders default toolbar 1`] = `
4
- <div
5
- className="toolbar pie-toolbar"
6
- onClick={[Function]}
7
- style={Object {}}
8
- >
9
- <div
10
- className="DefaultToolbar-defaultToolbar-1"
11
- onFocus={[Function]}
12
- tabIndex="1"
13
- >
14
- <div
15
- className="DefaultToolbar-buttonsContainer-2"
16
- />
17
- <div
18
- ariaLabel="Done"
19
- className="RawDoneButton-iconRoot-3"
20
- />
21
- </div>
22
- <div
23
- className="shared"
24
- />
25
- </div>
26
- `;
27
-
28
- exports[`toolbar renders custom toolbar 1`] = `
29
- <div
30
- className="toolbar pie-toolbar"
31
- onClick={[Function]}
32
- style={Object {}}
33
- >
34
- <div>
35
- --------- custom toolbar -----------
36
- </div>
37
- <div
38
- className="shared"
39
- >
40
- <div
41
- ariaLabel="Delete"
42
- className="iconRoot"
43
- />
44
- </div>
45
- </div>
46
- `;
@@ -1,94 +0,0 @@
1
- import { classObject, mockIconButton, mockMathInput } from '../../../__tests__/utils';
2
- import { shallow } from 'enzyme';
3
- import React from 'react';
4
-
5
- import { Data, Value, Inline } from 'slate';
6
- import { DefaultToolbar, ToolbarButton } from '../default-toolbar';
7
- import { DoneButton } from '../done-button';
8
- import debug from 'debug';
9
- import renderer from 'react-test-renderer';
10
-
11
- mockMathInput();
12
-
13
- jest.mock('@material-ui/core/IconButton', () => {
14
- return (props) => <div className={props.className} style={props.style} ariaLabel={props['aria-label']} />;
15
- });
16
-
17
- let node = Inline.fromJSON({ type: 'i' });
18
- let value;
19
- const log = debug('@pie-lib:editable-html:test:toolbar');
20
-
21
- describe('default-toolbar', () => {
22
- let w;
23
- let onDone = jest.fn();
24
- let onChange = jest.fn();
25
- const wrapper = (extras) => {
26
- const defaults = {
27
- classes: {},
28
- value: Value.fromJSON({}),
29
- plugins: [],
30
- className: 'className',
31
- onDone,
32
- onChange,
33
- deletable: false,
34
- showDone: true,
35
- };
36
- const props = { ...defaults, ...extras };
37
- return shallow(<DefaultToolbar {...props} />);
38
- };
39
-
40
- describe('snapshot', () => {
41
- it('renders', () => {
42
- expect(w).toMatchSnapshot();
43
- });
44
- it('renders 1 plugins', () => {
45
- w = wrapper({
46
- plugins: [{ toolbar: {}, name: 'plugin-one' }],
47
- });
48
- expect(w).toMatchSnapshot();
49
- expect(w.find(ToolbarButton)).toHaveLength(1);
50
- });
51
- it('renders 2 plugins', () => {
52
- w = wrapper({
53
- plugins: [
54
- { toolbar: {}, name: 'plugin-one' },
55
- { toolbar: {}, name: 'plugin-two' },
56
- ],
57
- });
58
- expect(w).toMatchSnapshot();
59
- expect(w.find(ToolbarButton)).toHaveLength(2);
60
- });
61
- it('renders 1 plugins, 1 is disabled', () => {
62
- w = wrapper({
63
- pluginProps: {
64
- 'plugin-one': {
65
- disabled: true,
66
- },
67
- },
68
- plugins: [
69
- { toolbar: {}, name: 'plugin-one' },
70
- { toolbar: {}, name: 'plugin-two' },
71
- ],
72
- });
73
- expect(w).toMatchSnapshot();
74
- expect(w.find(ToolbarButton)).toHaveLength(1);
75
- });
76
- it('renders without done button', () => {
77
- w = wrapper({
78
- deletable: false,
79
- });
80
-
81
- expect(w).toMatchSnapshot();
82
- expect(w.find(DoneButton)).toHaveLength(1);
83
- });
84
- it('renders with done button', () => {
85
- w = wrapper({
86
- deletable: true,
87
- });
88
-
89
- expect(w).toMatchSnapshot();
90
- expect(w.find(DoneButton)).toHaveLength(0);
91
- });
92
- });
93
- describe('logic', () => {});
94
- });
@@ -1,37 +0,0 @@
1
- import { classObject, mockIconButton } from '../../../__tests__/utils';
2
-
3
- import { Data, Value } from 'slate';
4
- import { EditorAndToolbar, getClonedChildren } from '../editor-and-toolbar';
5
- import React from 'react';
6
- import debug from 'debug';
7
- import renderer from 'react-test-renderer';
8
-
9
- jest.mock('../toolbar', () => () => <div>---- toolbar ------ </div>);
10
-
11
- mockIconButton();
12
-
13
- const log = debug('@pie-lib:editable-html:test:editor-and-toolbar');
14
-
15
- describe('toolbar', () => {
16
- let onDelete, classes;
17
-
18
- beforeEach(() => {
19
- onDelete = jest.fn();
20
- classes = classObject('root', 'editorHolder', 'editorInFocus');
21
- });
22
-
23
- it('renders', () => {
24
- const value = Value.fromJSON({});
25
- Object.defineProperty(value, 'isFocused', { get: jest.fn(() => true) });
26
-
27
- const tree = renderer
28
- .create(
29
- <EditorAndToolbar classes={classes} value={value} plugins={[]} onDone={jest.fn()} onChange={jest.fn()}>
30
- children
31
- </EditorAndToolbar>,
32
- )
33
- .toJSON();
34
- log('tree: ', JSON.stringify(tree, null, ' '));
35
- expect(tree).toMatchSnapshot();
36
- });
37
- });
@@ -1,51 +0,0 @@
1
- import { classObject, mockIconButton } from '../../../__tests__/utils';
2
-
3
- import { Data } from 'slate';
4
- import { RawMarkButton, RawButton } from '../toolbar-buttons';
5
- import React from 'react';
6
- import debug from 'debug';
7
- import renderer from 'react-test-renderer';
8
-
9
- mockIconButton();
10
-
11
- const log = debug('@pie-lib:editable-html:test:editor-and-toolbar');
12
-
13
- describe('Button', () => {
14
- it('renders', () => {
15
- const classes = classObject('root');
16
- const tree = renderer
17
- .create(
18
- <RawButton onClick={jest.fn()} classes={classes}>
19
- children
20
- </RawButton>,
21
- )
22
- .toJSON();
23
- expect(tree).toMatchSnapshot();
24
- });
25
- });
26
-
27
- describe('MarkButton', () => {
28
- const classes = classObject('button', 'root', 'active');
29
-
30
- it('renders not active', () => {
31
- const tree = renderer
32
- .create(
33
- <RawMarkButton mark={'i'} onToggle={jest.fn()} active={false} classes={classes}>
34
- children
35
- </RawMarkButton>,
36
- )
37
- .toJSON();
38
- expect(tree).toMatchSnapshot();
39
- });
40
-
41
- it('renders active', () => {
42
- const tree = renderer
43
- .create(
44
- <RawMarkButton mark={'i'} onToggle={jest.fn()} active={true} classes={classes}>
45
- children
46
- </RawMarkButton>,
47
- )
48
- .toJSON();
49
- expect(tree).toMatchSnapshot();
50
- });
51
- });
@@ -1,106 +0,0 @@
1
- import { classObject, mockIconButton, mockMathInput } from '../../../__tests__/utils';
2
- import { shallow } from 'enzyme';
3
-
4
- import { Data, Value, Inline } from 'slate';
5
- import { Toolbar, DefaultToolbar } from '../toolbar';
6
- import React from 'react';
7
- import debug from 'debug';
8
- import renderer from 'react-test-renderer';
9
-
10
- mockMathInput();
11
-
12
- jest.mock('@material-ui/core/IconButton', () => {
13
- return (props) => <div className={props.className} style={props.style} ariaLabel={props['aria-label']} />;
14
- });
15
-
16
- let node = Inline.fromJSON({ type: 'i' });
17
- let parentNode = Inline.fromJSON({
18
- type: 'i',
19
- });
20
- let value;
21
- const log = debug('@pie-lib:editable-html:test:toolbar');
22
-
23
- describe('toolbar', () => {
24
- let onDelete, classes, document, toolbarOpts;
25
-
26
- beforeEach(() => {
27
- onDelete = jest.fn();
28
-
29
- toolbarOpts = {
30
- position: 'bottom',
31
- alwaysVisible: false,
32
- };
33
-
34
- value = Value.fromJSON({});
35
- document = {
36
- getClosestInline: jest.fn().mockReturnValue(node),
37
- getParent: jest.fn().mockReturnValue(),
38
- };
39
-
40
- Object.defineProperties(value, {
41
- isCollapsed: {
42
- get: jest.fn(() => true),
43
- },
44
- startKey: {
45
- get: jest.fn(() => '1'),
46
- },
47
- document: {
48
- get: jest.fn(() => document),
49
- },
50
- });
51
-
52
- classes = classObject('iconRoot', 'inline', 'toolbar', 'focused', 'shared', 'inline', 'pie-toolbar');
53
- });
54
-
55
- test('renders custom toolbar', () => {
56
- const plugins = [
57
- {
58
- deleteNode: () => true,
59
- toolbar: {
60
- supports: () => true,
61
- customToolbar: () => () => <div> --------- custom toolbar ----------- </div>,
62
- },
63
- },
64
- ];
65
-
66
- const tree = renderer
67
- .create(
68
- <Toolbar
69
- toolbarOpts={toolbarOpts}
70
- plugins={plugins}
71
- classes={classes}
72
- value={value}
73
- onDone={jest.fn()}
74
- onChange={jest.fn()}
75
- />,
76
- )
77
- .toJSON();
78
-
79
- log('tree: ', JSON.stringify(tree, null, ' '));
80
- expect(tree).toMatchSnapshot();
81
- });
82
-
83
- describe('default', () => {
84
- let plugins;
85
-
86
- beforeEach(() => {
87
- plugins = [];
88
- });
89
-
90
- test('renders default toolbar', () => {
91
- const tree = renderer
92
- .create(
93
- <Toolbar
94
- toolbarOpts={toolbarOpts}
95
- plugins={plugins}
96
- classes={classes}
97
- value={value}
98
- onDone={jest.fn()}
99
- onChange={jest.fn()}
100
- />,
101
- )
102
- .toJSON();
103
- expect(tree).toMatchSnapshot();
104
- });
105
- });
106
- });
@@ -1,206 +0,0 @@
1
- import { DoneButton } from './done-button';
2
- import PropTypes from 'prop-types';
3
- import React from 'react';
4
- import SlatePropTypes from 'slate-prop-types';
5
-
6
- import { hasBlock, hasMark } from '../utils';
7
- import { withStyles } from '@material-ui/core/styles';
8
-
9
- import { Button, MarkButton } from './toolbar-buttons';
10
- import debug from 'debug';
11
-
12
- const log = debug('@pie-lib:editable-html:plugins:toolbar');
13
-
14
- export const ToolbarButton = (props) => {
15
- const onToggle = () => {
16
- const c = props.onToggle(props.value.change(), props);
17
-
18
- props.onChange(c);
19
- };
20
-
21
- if (props.isMark) {
22
- const isActive = hasMark(props.value, props.type);
23
- const fnToCall =
24
- props.type === 'css' ? () => props.onClick(props.value, props.onChange, props.getFocusedValue) : onToggle;
25
-
26
- log('[ToolbarButton] mark:isActive: ', isActive);
27
-
28
- let ariaLabel;
29
-
30
- if (props.type === 'sup') {
31
- ariaLabel = 'Superscript (marks text as superscripted)';
32
- } else if (props.type === 'sub') {
33
- ariaLabel = 'Subscript (marks text as subscripted)';
34
- } else {
35
- ariaLabel = props.type;
36
- }
37
-
38
- return (
39
- <MarkButton active={isActive} onToggle={fnToCall} mark={props.type} label={ariaLabel}>
40
- {props.icon}
41
- </MarkButton>
42
- );
43
- }
44
-
45
- const { disabled } = props;
46
- const isActive = props.isActive ? props.isActive(props.value, props.type) : hasBlock(props.value, props.type);
47
-
48
- log('[ToolbarButton] block:isActive: ', isActive);
49
- const newIcon = React.cloneElement(props.icon);
50
-
51
- return (
52
- <Button
53
- ariaLabel={props.ariaLabel}
54
- active={isActive}
55
- disabled={disabled}
56
- onClick={(event) => props.onClick(props.value, props.onChange, props.getFocusedValue, event)}
57
- extraStyles={props.buttonStyles}
58
- >
59
- {newIcon}
60
- </Button>
61
- );
62
- };
63
-
64
- ToolbarButton.propTypes = {
65
- buttonStyles: PropTypes.object,
66
- disabled: PropTypes.bool,
67
- icon: PropTypes.any,
68
- isActive: PropTypes.bool,
69
- isMark: PropTypes.bool,
70
- getFocusedValue: PropTypes.func,
71
- onToggle: PropTypes.func,
72
- onChange: PropTypes.func,
73
- onClick: PropTypes.func,
74
- type: PropTypes.string,
75
- value: PropTypes.object,
76
- ariaLabel: PropTypes.string,
77
- };
78
-
79
- const isActiveToolbarPlugin = (props) => (plugin) => {
80
- const isDisabled = (props[plugin.name] || {}).disabled;
81
-
82
- return plugin && plugin.toolbar && !isDisabled;
83
- };
84
-
85
- export const DefaultToolbar = ({
86
- plugins,
87
- pluginProps,
88
- value,
89
- onChange,
90
- getFocusedValue,
91
- onDone,
92
- classes,
93
- showDone,
94
- deletable,
95
- isHtmlMode,
96
- doneButtonRef,
97
- onBlur,
98
- onFocus,
99
- }) => {
100
- pluginProps = {
101
- // disable HTML plugin by default, at least for now
102
- html: { disabled: true },
103
- ...pluginProps,
104
- };
105
- let filtered;
106
-
107
- const handleFocus = (event) => {
108
- const doneButtonClassName = doneButtonRef?.current?.className;
109
- const isRawDoneButton = doneButtonClassName && event.target?.closest(`[class*="${doneButtonClassName}"]`);
110
-
111
- if (onFocus && !isRawDoneButton) {
112
- onFocus(event);
113
- }
114
- };
115
-
116
- if (isHtmlMode) {
117
- filtered = plugins
118
- .filter((plugin) => {
119
- return isActiveToolbarPlugin(pluginProps)(plugin) && (plugin.name === 'characters' || plugin.name === 'html');
120
- })
121
- .map((p) => p.toolbar);
122
- } else {
123
- filtered = plugins.filter(isActiveToolbarPlugin(pluginProps)).map((p) => p.toolbar);
124
- }
125
-
126
- const isListActive = plugins.some(
127
- (plugin) =>
128
- isActiveToolbarPlugin(pluginProps)(plugin) &&
129
- ['ul_list', 'ol_list'].includes(plugin.name) &&
130
- plugin.toolbar.isActive(value, plugin.name),
131
- );
132
-
133
- const isTableActive = plugins.some(
134
- (plugin) =>
135
- isActiveToolbarPlugin(pluginProps)(plugin) &&
136
- plugin.name === 'table' &&
137
- plugin.utils &&
138
- plugin.utils.isSelectionInTable &&
139
- plugin.utils.isSelectionInTable(value),
140
- );
141
-
142
- const isToolbarButtonDisabled = (plugin) => {
143
- if (plugin.type === 'table') {
144
- return isListActive;
145
- } else if (plugin.type === 'ul_list' || plugin.type === 'ol_list') {
146
- return isTableActive;
147
- }
148
- return plugin.disabled;
149
- };
150
-
151
- return (
152
- <div className={classes.defaultToolbar} onFocus={handleFocus} tabIndex="1" onBlur={onBlur}>
153
- <div className={classes.buttonsContainer}>
154
- {filtered.map((p, index) => {
155
- return (
156
- <ToolbarButton
157
- {...p}
158
- key={index}
159
- value={value}
160
- onChange={onChange}
161
- getFocusedValue={getFocusedValue}
162
- disabled={isToolbarButtonDisabled(p)}
163
- />
164
- );
165
- })}
166
- </div>
167
- {showDone && !deletable && <DoneButton doneButtonRef={doneButtonRef} onClick={onDone} />}
168
- </div>
169
- );
170
- };
171
-
172
- DefaultToolbar.propTypes = {
173
- classes: PropTypes.object.isRequired,
174
- plugins: PropTypes.array.isRequired,
175
- pluginProps: PropTypes.object,
176
- value: SlatePropTypes.value.isRequired,
177
- onChange: PropTypes.func.isRequired,
178
- getFocusedValue: PropTypes.func.isRequired,
179
- onDone: PropTypes.func.isRequired,
180
- showDone: PropTypes.bool,
181
- addArea: PropTypes.bool,
182
- deletable: PropTypes.bool,
183
- isHtmlMode: PropTypes.bool,
184
- doneButtonRef: PropTypes.func,
185
- onBlur: PropTypes.func,
186
- onFocus: PropTypes.func,
187
- };
188
-
189
- DefaultToolbar.defaultProps = {
190
- pluginProps: {},
191
- };
192
-
193
- const toolbarStyles = () => ({
194
- defaultToolbar: {
195
- display: 'flex',
196
- width: '100%',
197
- justifyContent: 'space-between',
198
- },
199
- buttonsContainer: {
200
- alignItems: 'center',
201
- display: 'flex',
202
- width: '100%',
203
- },
204
- });
205
-
206
- export default withStyles(toolbarStyles)(DefaultToolbar);