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

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 (129) hide show
  1. package/lib/components/CharacterPicker.js +221 -0
  2. package/lib/components/EditableHtml.js +323 -0
  3. package/lib/components/MenuBar.js +693 -0
  4. package/lib/components/TiptapContainer.js +90 -0
  5. package/lib/components/buttons/done-button.js +53 -0
  6. package/lib/components/characters/characterUtils.js +112 -0
  7. package/lib/components/characters/custom-popper.js +73 -0
  8. package/lib/components/common/done-button.js +53 -0
  9. package/lib/components/icons/CssIcon.js +37 -0
  10. package/lib/components/icons/RespArea.js +95 -0
  11. package/lib/components/icons/TableIcons.js +69 -0
  12. package/lib/components/icons/TextAlign.js +194 -0
  13. package/lib/components/icons/index.js +194 -0
  14. package/lib/components/image/ImageToolbar.js +16 -0
  15. package/lib/components/image/InsertImageHandler.js +16 -0
  16. package/lib/components/media/MediaDialog.js +16 -0
  17. package/lib/components/media/MediaToolbar.js +16 -0
  18. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js +94 -0
  19. package/lib/components/respArea/DragInTheBlank/choice.js +289 -0
  20. package/lib/components/respArea/DragInTheBlank.js +94 -0
  21. package/lib/components/respArea/ExplicitConstructedResponse.js +120 -0
  22. package/lib/components/respArea/InlineDropdown.js +126 -0
  23. package/lib/components/respArea/ToolbarIcon.js +105 -0
  24. package/lib/components/respArea/choice.js +2 -0
  25. package/lib/extensions/component.js +5 -5
  26. package/lib/extensions/custom-toolbar-wrapper.js +2 -4
  27. package/lib/extensions/extended-table.js +30 -0
  28. package/lib/extensions/index.js +52 -0
  29. package/lib/extensions/media.js +5 -5
  30. package/lib/extensions/responseArea.js +7 -7
  31. package/lib/index.js +16 -1481
  32. package/lib/plugins/index.js +8 -80
  33. package/lib/styles/editorContainerStyles.js +200 -0
  34. package/lib/utils/size.js +34 -0
  35. package/package.json +1 -1
  36. package/src/components/CharacterPicker.jsx +185 -0
  37. package/src/components/EditableHtml.jsx +306 -0
  38. package/src/components/MenuBar.jsx +630 -0
  39. package/src/components/TiptapContainer.jsx +96 -0
  40. package/src/components/characters/characterUtils.js +127 -0
  41. package/src/components/image/ImageToolbar.jsx +1 -0
  42. package/src/components/image/InsertImageHandler.js +1 -0
  43. package/src/components/media/MediaDialog.js +1 -0
  44. package/src/components/media/MediaToolbar.jsx +1 -0
  45. package/src/{plugins/respArea/drag-in-the-blank → components/respArea/DragInTheBlank}/choice.jsx +1 -1
  46. package/src/{plugins/respArea/inline-dropdown/index.jsx → components/respArea/InlineDropdown.jsx} +1 -1
  47. package/src/components/respArea/ToolbarIcon.jsx +68 -0
  48. package/src/extensions/component.jsx +2 -2
  49. package/src/extensions/custom-toolbar-wrapper.jsx +6 -7
  50. package/src/extensions/extended-table.js +27 -0
  51. package/src/extensions/index.js +76 -0
  52. package/src/extensions/media.js +10 -4
  53. package/src/extensions/responseArea.js +7 -7
  54. package/src/index.jsx +3 -1440
  55. package/src/styles/editorContainerStyles.js +203 -0
  56. package/src/utils/size.js +32 -0
  57. package/src/__tests__/editor.test.jsx +0 -363
  58. package/src/__tests__/serialization.test.js +0 -291
  59. package/src/block-tags.js +0 -17
  60. package/src/editor.jsx +0 -1197
  61. package/src/extensions/characters.js +0 -46
  62. package/src/old-index.jsx +0 -162
  63. package/src/parse-html.js +0 -8
  64. package/src/plugins/README.md +0 -27
  65. package/src/plugins/characters/index.jsx +0 -284
  66. package/src/plugins/characters/utils.js +0 -447
  67. package/src/plugins/css/index.jsx +0 -340
  68. package/src/plugins/customPlugin/index.jsx +0 -85
  69. package/src/plugins/html/icons/index.jsx +0 -19
  70. package/src/plugins/html/index.jsx +0 -72
  71. package/src/plugins/image/__tests__/__snapshots__/component.test.jsx.snap +0 -51
  72. package/src/plugins/image/__tests__/__snapshots__/image-toolbar-logic.test.jsx.snap +0 -27
  73. package/src/plugins/image/__tests__/__snapshots__/image-toolbar.test.jsx.snap +0 -44
  74. package/src/plugins/image/__tests__/component.test.jsx +0 -41
  75. package/src/plugins/image/__tests__/image-toolbar-logic.test.jsx +0 -42
  76. package/src/plugins/image/__tests__/image-toolbar.test.jsx +0 -11
  77. package/src/plugins/image/__tests__/index.test.js +0 -95
  78. package/src/plugins/image/__tests__/insert-image-handler.test.js +0 -113
  79. package/src/plugins/image/__tests__/mock-change.js +0 -15
  80. package/src/plugins/image/alt-dialog.jsx +0 -82
  81. package/src/plugins/image/component.jsx +0 -343
  82. package/src/plugins/image/image-toolbar.jsx +0 -100
  83. package/src/plugins/image/index.jsx +0 -227
  84. package/src/plugins/image/insert-image-handler.js +0 -79
  85. package/src/plugins/index.jsx +0 -377
  86. package/src/plugins/list/__tests__/index.test.js +0 -54
  87. package/src/plugins/list/index.jsx +0 -305
  88. package/src/plugins/math/__tests__/__snapshots__/index.test.jsx.snap +0 -48
  89. package/src/plugins/math/__tests__/index.test.jsx +0 -245
  90. package/src/plugins/math/index.jsx +0 -379
  91. package/src/plugins/media/__tests__/index.test.js +0 -75
  92. package/src/plugins/media/index.jsx +0 -325
  93. package/src/plugins/media/media-dialog.js +0 -624
  94. package/src/plugins/media/media-toolbar.jsx +0 -56
  95. package/src/plugins/media/media-wrapper.jsx +0 -43
  96. package/src/plugins/rendering/index.js +0 -31
  97. package/src/plugins/respArea/index.jsx +0 -299
  98. package/src/plugins/respArea/math-templated/index.jsx +0 -104
  99. package/src/plugins/respArea/utils.jsx +0 -90
  100. package/src/plugins/table/CustomTablePlugin.js +0 -113
  101. package/src/plugins/table/__tests__/__snapshots__/table-toolbar.test.jsx.snap +0 -44
  102. package/src/plugins/table/__tests__/index.test.jsx +0 -401
  103. package/src/plugins/table/__tests__/table-toolbar.test.jsx +0 -42
  104. package/src/plugins/table/index.jsx +0 -427
  105. package/src/plugins/table/table-toolbar.jsx +0 -136
  106. package/src/plugins/textAlign/index.jsx +0 -23
  107. package/src/plugins/toolbar/__tests__/__snapshots__/default-toolbar.test.jsx.snap +0 -923
  108. package/src/plugins/toolbar/__tests__/__snapshots__/editor-and-toolbar.test.jsx.snap +0 -20
  109. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar-buttons.test.jsx.snap +0 -36
  110. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar.test.jsx.snap +0 -46
  111. package/src/plugins/toolbar/__tests__/default-toolbar.test.jsx +0 -94
  112. package/src/plugins/toolbar/__tests__/editor-and-toolbar.test.jsx +0 -37
  113. package/src/plugins/toolbar/__tests__/toolbar-buttons.test.jsx +0 -51
  114. package/src/plugins/toolbar/__tests__/toolbar.test.jsx +0 -106
  115. package/src/plugins/toolbar/default-toolbar.jsx +0 -206
  116. package/src/plugins/toolbar/editor-and-toolbar.jsx +0 -257
  117. package/src/plugins/toolbar/index.jsx +0 -23
  118. package/src/plugins/toolbar/toolbar-buttons.jsx +0 -138
  119. package/src/plugins/toolbar/toolbar.jsx +0 -338
  120. package/src/plugins/utils.js +0 -31
  121. package/src/serialization.jsx +0 -621
  122. /package/src/{plugins → components}/characters/custom-popper.js +0 -0
  123. /package/src/{plugins/toolbar → components/common}/done-button.jsx +0 -0
  124. /package/src/{plugins/css/icons/index.jsx → components/icons/CssIcon.jsx} +0 -0
  125. /package/src/{plugins/respArea/icons/index.jsx → components/icons/RespArea.jsx} +0 -0
  126. /package/src/{plugins/table/icons/index.jsx → components/icons/TableIcons.jsx} +0 -0
  127. /package/src/{plugins/textAlign/icons/index.jsx → components/icons/TextAlign.jsx} +0 -0
  128. /package/src/{plugins/respArea/drag-in-the-blank/index.jsx → components/respArea/DragInTheBlank/DragInTheBlank.jsx} +0 -0
  129. /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);