@squiz/formatted-text-editor 1.12.0-alpha.39 → 1.12.0-alpha.42

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 (57) hide show
  1. package/README.md +2 -0
  2. package/jest.config.ts +2 -0
  3. package/lib/Editor/Editor.js +2 -13
  4. package/lib/EditorToolbar/EditorToolbar.js +3 -1
  5. package/lib/EditorToolbar/Tools/Link/Form/LinkForm.d.ts +3 -0
  6. package/lib/EditorToolbar/Tools/Link/Form/LinkForm.js +29 -0
  7. package/lib/EditorToolbar/Tools/Link/LinkButton.d.ts +7 -0
  8. package/lib/EditorToolbar/Tools/Link/LinkButton.js +8 -0
  9. package/lib/EditorToolbar/Tools/Link/Trigger/TriggerLinkModal.d.ts +3 -0
  10. package/lib/EditorToolbar/Tools/Link/Trigger/TriggerLinkModal.js +12 -0
  11. package/lib/Extensions/Extensions.d.ts +3 -0
  12. package/lib/Extensions/Extensions.js +13 -0
  13. package/lib/index.css +401 -3744
  14. package/lib/ui/Inputs/Select/Select.d.ts +12 -0
  15. package/lib/ui/Inputs/Select/Select.js +19 -0
  16. package/lib/ui/Inputs/Text/TextInput.d.ts +8 -0
  17. package/lib/ui/Inputs/Text/TextInput.js +6 -0
  18. package/lib/ui/Modal/Modal.d.ts +9 -0
  19. package/lib/ui/Modal/Modal.js +30 -0
  20. package/lib/ui/ToolbarButton/ToolbarButton.js +1 -1
  21. package/package.json +10 -7
  22. package/src/Editor/Editor.mock.tsx +40 -0
  23. package/src/Editor/Editor.spec.tsx +28 -2
  24. package/src/Editor/Editor.tsx +3 -23
  25. package/src/Editor/_editor.scss +16 -9
  26. package/src/EditorToolbar/EditorToolbar.tsx +2 -0
  27. package/src/EditorToolbar/Tools/Bold/BoldButton.spec.tsx +1 -1
  28. package/src/EditorToolbar/Tools/Italic/ItalicButton.spec.tsx +1 -1
  29. package/src/EditorToolbar/Tools/Link/Form/LinkForm.spec.tsx +21 -0
  30. package/src/EditorToolbar/Tools/Link/Form/LinkForm.tsx +41 -0
  31. package/src/EditorToolbar/Tools/Link/LinkButton.spec.tsx +26 -0
  32. package/src/EditorToolbar/Tools/Link/LinkButton.tsx +25 -0
  33. package/src/EditorToolbar/Tools/Link/Trigger/TriggerLinkModal.spec.tsx +41 -0
  34. package/src/EditorToolbar/Tools/Link/Trigger/TriggerLinkModal.tsx +21 -0
  35. package/src/EditorToolbar/Tools/TextType/Preformatted/PreformattedButton.tsx +1 -1
  36. package/src/EditorToolbar/Tools/TextType/TextTypeDropdown.tsx +1 -1
  37. package/src/EditorToolbar/Tools/Underline/Underline.spec.tsx +1 -1
  38. package/src/EditorToolbar/_editor-toolbar.scss +1 -1
  39. package/src/Extensions/Extensions.tsx +24 -0
  40. package/src/FormattedTextEditor.spec.tsx +10 -0
  41. package/src/index.scss +5 -2
  42. package/src/ui/DropdownButton/_dropdown-button.scss +3 -2
  43. package/src/ui/Inputs/Select/Select.spec.tsx +24 -0
  44. package/src/ui/Inputs/Select/Select.tsx +67 -0
  45. package/src/ui/Inputs/Text/TextInput.spec.tsx +43 -0
  46. package/src/ui/Inputs/Text/TextInput.tsx +20 -0
  47. package/src/ui/Modal/Modal.spec.tsx +75 -0
  48. package/src/ui/Modal/Modal.tsx +70 -0
  49. package/src/ui/Modal/_modal.scss +24 -0
  50. package/src/ui/ToolbarButton/ToolbarButton.tsx +1 -1
  51. package/src/ui/ToolbarButton/_toolbar-button.scss +5 -25
  52. package/src/ui/_buttons.scss +19 -0
  53. package/src/ui/_forms.scss +16 -0
  54. package/tailwind.config.cjs +23 -0
  55. /package/lib/{extensions → Extensions}/PreformattedExtension/PreformattedExtension.d.ts +0 -0
  56. /package/lib/{extensions → Extensions}/PreformattedExtension/PreformattedExtension.js +0 -0
  57. /package/src/{extensions → Extensions}/PreformattedExtension/PreformattedExtension.tsx +0 -0
package/README.md CHANGED
@@ -51,6 +51,8 @@ Or if you'd like to "watch" for changes:
51
51
  npm run test:watch
52
52
  ```
53
53
 
54
+ When testing text input in the text editor, it is recommended to use the `<MockEditor />` component, which is a simple wrapper around the Remirror component that provides additional functionality for testing (supplying text into the editor).
55
+
54
56
  ### End to end testing
55
57
 
56
58
  This package uses [Cypress](https://docs.cypress.io/) for end to end testing.
package/jest.config.ts CHANGED
@@ -14,6 +14,8 @@ export default {
14
14
  moduleNameMapper: {
15
15
  '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|css|scss)$':
16
16
  '<rootDir>/file-transformer.js',
17
+ '^react($|/.+)': '<rootDir>/node_modules/react$1',
18
+ '^react-dom($|/.+)': '<rootDir>/node_modules/react-dom$1',
17
19
  },
18
20
  // TODO: enable once directory structure is sorted and we have tests/more complete code being written.
19
21
  // coverageThreshold: {
@@ -1,21 +1,10 @@
1
1
  import React from 'react';
2
- import { BoldExtension, HeadingExtension, ItalicExtension, NodeFormattingExtension, ParagraphExtension, UnderlineExtension, HistoryExtension, wysiwygPreset, } from 'remirror/extensions';
3
2
  import { EditorComponent, Remirror, useRemirror } from '@remirror/react';
4
3
  import { EditorToolbar } from '../EditorToolbar/EditorToolbar';
5
- import { PreformattedExtension } from '../extensions/PreformattedExtension/PreformattedExtension';
4
+ import { Extensions } from '../Extensions/Extensions';
6
5
  const Editor = ({ content }) => {
7
6
  const { manager, state, setState } = useRemirror({
8
- extensions: () => [
9
- ...wysiwygPreset(),
10
- new BoldExtension(),
11
- new HeadingExtension(),
12
- new ItalicExtension(),
13
- new NodeFormattingExtension(),
14
- new ParagraphExtension(),
15
- new PreformattedExtension(),
16
- new UnderlineExtension(),
17
- new HistoryExtension(),
18
- ],
7
+ extensions: Extensions,
19
8
  content,
20
9
  selection: 'start',
21
10
  stringHandler: 'html',
@@ -7,6 +7,7 @@ import TextAlignButtons from './Tools/TextAlign/TextAlignButtons';
7
7
  import UndoButton from './Tools/Undo/UndoButton';
8
8
  import RedoButton from './Tools/Redo/RedoButton';
9
9
  import TextTypeDropdown from './Tools/TextType/TextTypeDropdown';
10
+ import TriggerLinkModal from './Tools/Link/Trigger/TriggerLinkModal';
10
11
  // The editor main toolbar
11
12
  export const EditorToolbar = ({ manager, isPopover }) => {
12
13
  const extensionNames = {};
@@ -22,7 +23,8 @@ export const EditorToolbar = ({ manager, isPopover }) => {
22
23
  extensionNames.bold && React.createElement(BoldButton, null),
23
24
  extensionNames.italic && React.createElement(ItalicButton, null),
24
25
  extensionNames.underline && React.createElement(UnderlineButton, null),
25
- extensionNames.nodeFormatting && React.createElement(TextAlignButtons, null))) : (React.createElement(FloatingToolbar, { className: "remirror-floating-popover" },
26
+ extensionNames.nodeFormatting && React.createElement(TextAlignButtons, null),
27
+ React.createElement(TriggerLinkModal, null))) : (React.createElement(FloatingToolbar, { className: "remirror-floating-popover" },
26
28
  extensionNames.bold && React.createElement(BoldButton, null),
27
29
  extensionNames.italic && React.createElement(ItalicButton, null),
28
30
  extensionNames.underline && React.createElement(UnderlineButton, null)))));
@@ -0,0 +1,3 @@
1
+ import { ReactElement } from 'react';
2
+ declare const LinkForm: () => ReactElement;
3
+ export default LinkForm;
@@ -0,0 +1,29 @@
1
+ import React, { useState } from 'react';
2
+ import { TextInput } from '../../../../ui/Inputs/Text/TextInput';
3
+ import { Select } from '../../../../ui/Inputs/Select/Select';
4
+ const selectOptions = [
5
+ { id: 1, name: 'Current window', key: '_blank' },
6
+ { id: 2, name: 'New window', key: '_parent' },
7
+ ];
8
+ const LinkForm = () => {
9
+ const [formValues, setFormValues] = useState({
10
+ href: '',
11
+ target: selectOptions[0],
12
+ title: '',
13
+ text: '',
14
+ });
15
+ const handleChange = (event) => {
16
+ const { name, value } = event.target;
17
+ setFormValues({ ...formValues, [name]: value });
18
+ };
19
+ return (React.createElement("form", { action: "", method: "post", className: "sds-form" },
20
+ React.createElement("div", { className: "sds-form-group mb-2" },
21
+ React.createElement(TextInput, { id: "href", label: "URL", value: formValues.href, onChange: handleChange })),
22
+ React.createElement("div", { className: "sds-form-group mb-2" },
23
+ React.createElement(TextInput, { id: "text", label: "Text", value: formValues.text, onChange: handleChange })),
24
+ React.createElement("div", { className: "sds-form-group mb-2" },
25
+ React.createElement(TextInput, { id: "title", label: "Title", value: formValues.title, onChange: handleChange })),
26
+ React.createElement("div", { className: "sds-form-group mb-0" },
27
+ React.createElement(Select, { id: "target", label: "Target", value: formValues.target, options: selectOptions }))));
28
+ };
29
+ export default LinkForm;
@@ -0,0 +1,7 @@
1
+ type LinkButtonProps = {
2
+ onClick: () => void;
3
+ enabled: boolean;
4
+ showModal: boolean;
5
+ };
6
+ declare const LinkButton: ({ onClick, showModal, enabled }: LinkButtonProps) => JSX.Element;
7
+ export default LinkButton;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import ToolbarButton from '../../../ui/ToolbarButton/ToolbarButton';
3
+ import InsertLinkRoundedIcon from '@mui/icons-material/InsertLinkRounded';
4
+ const LinkButton = ({ onClick, showModal, enabled }) => {
5
+ const active = showModal;
6
+ return (React.createElement(ToolbarButton, { handleOnClick: onClick, isDisabled: !enabled, isActive: active, icon: React.createElement(InsertLinkRoundedIcon, null), label: `Link` }));
7
+ };
8
+ export default LinkButton;
@@ -0,0 +1,3 @@
1
+ import { ReactElement } from 'react';
2
+ declare const TriggerLinkModal: () => ReactElement;
3
+ export default TriggerLinkModal;
@@ -0,0 +1,12 @@
1
+ import React, { useState } from 'react';
2
+ import LinkButton from '../LinkButton';
3
+ import Modal from '../../../../ui/Modal/Modal';
4
+ import LinkForm from '../Form/LinkForm';
5
+ const TriggerLinkModal = () => {
6
+ const [showModal, setShowModal] = useState(false);
7
+ return (React.createElement(React.Fragment, null,
8
+ React.createElement(LinkButton, { showModal: showModal, onClick: () => setShowModal(true), enabled: true }),
9
+ showModal ? (React.createElement(Modal, { onCancel: () => setShowModal(false), onSubmit: () => console.log('Sumbmit form') },
10
+ React.createElement(LinkForm, null))) : null));
11
+ };
12
+ export default TriggerLinkModal;
@@ -0,0 +1,3 @@
1
+ import { BoldExtension, HeadingExtension, NodeFormattingExtension, HistoryExtension } from 'remirror/extensions';
2
+ import { Extension } from '@remirror/core';
3
+ export declare const Extensions: () => (BoldExtension | HistoryExtension | HeadingExtension | NodeFormattingExtension | Extension<import("@remirror/core").EmptyShape>)[];
@@ -0,0 +1,13 @@
1
+ import { BoldExtension, HeadingExtension, ItalicExtension, NodeFormattingExtension, ParagraphExtension, UnderlineExtension, HistoryExtension, wysiwygPreset, } from 'remirror/extensions';
2
+ import { PreformattedExtension } from './PreformattedExtension/PreformattedExtension';
3
+ export const Extensions = () => [
4
+ ...wysiwygPreset(),
5
+ new BoldExtension(),
6
+ new HeadingExtension(),
7
+ new ItalicExtension(),
8
+ new NodeFormattingExtension(),
9
+ new ParagraphExtension(),
10
+ new PreformattedExtension(),
11
+ new UnderlineExtension(),
12
+ new HistoryExtension(),
13
+ ];