@squiz/formatted-text-editor 1.21.1-alpha.2 → 1.21.1-alpha.21
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.
- package/demo/App.tsx +45 -10
- package/demo/index.scss +11 -10
- package/lib/Editor/Editor.js +45 -7
- package/lib/Editor/EditorContext.d.ts +10 -0
- package/lib/Editor/EditorContext.js +15 -0
- package/lib/EditorToolbar/FloatingToolbar.js +11 -5
- package/lib/EditorToolbar/Toolbar.js +3 -1
- package/lib/EditorToolbar/Tools/Bold/BoldButton.js +2 -2
- package/lib/EditorToolbar/Tools/Image/Form/ImageForm.d.ts +17 -0
- package/lib/EditorToolbar/Tools/Image/Form/ImageForm.js +82 -0
- package/lib/EditorToolbar/Tools/Image/ImageButton.d.ts +5 -0
- package/lib/EditorToolbar/Tools/Image/ImageButton.js +77 -0
- package/lib/EditorToolbar/Tools/Image/ImageModal.d.ts +8 -0
- package/lib/EditorToolbar/Tools/Image/ImageModal.js +16 -0
- package/lib/EditorToolbar/Tools/Italic/ItalicButton.js +2 -2
- package/lib/EditorToolbar/Tools/Link/Form/LinkForm.d.ts +14 -5
- package/lib/EditorToolbar/Tools/Link/Form/LinkForm.js +67 -15
- package/lib/EditorToolbar/Tools/Link/LinkButton.js +22 -14
- package/lib/EditorToolbar/Tools/Link/LinkModal.js +12 -5
- package/lib/EditorToolbar/Tools/Link/RemoveLinkButton.js +2 -9
- package/lib/EditorToolbar/Tools/Redo/RedoButton.js +2 -2
- package/lib/EditorToolbar/Tools/TextAlign/CenterAlign/CenterAlignButton.js +2 -2
- package/lib/EditorToolbar/Tools/TextAlign/JustifyAlign/JustifyAlignButton.js +2 -2
- package/lib/EditorToolbar/Tools/TextAlign/LeftAlign/LeftAlignButton.js +2 -2
- package/lib/EditorToolbar/Tools/TextAlign/RightAlign/RightAlignButton.js +2 -2
- package/lib/EditorToolbar/Tools/Underline/UnderlineButton.js +2 -2
- package/lib/EditorToolbar/Tools/Undo/UndoButton.js +2 -2
- package/lib/Extensions/CommandsExtension/CommandsExtension.d.ts +20 -0
- package/lib/Extensions/CommandsExtension/CommandsExtension.js +52 -0
- package/lib/Extensions/Extensions.d.ts +7 -4
- package/lib/Extensions/Extensions.js +32 -19
- package/lib/Extensions/ImageExtension/ImageExtension.d.ts +10 -0
- package/lib/Extensions/ImageExtension/ImageExtension.js +92 -0
- package/lib/Extensions/LinkExtension/AssetLinkExtension.d.ts +26 -0
- package/lib/Extensions/LinkExtension/AssetLinkExtension.js +102 -0
- package/lib/Extensions/LinkExtension/LinkExtension.d.ts +21 -12
- package/lib/Extensions/LinkExtension/LinkExtension.js +63 -65
- package/lib/Extensions/LinkExtension/common.d.ts +7 -0
- package/lib/Extensions/LinkExtension/common.js +14 -0
- package/lib/Extensions/PreformattedExtension/PreformattedExtension.d.ts +1 -1
- package/lib/hooks/index.d.ts +1 -0
- package/lib/hooks/index.js +1 -0
- package/lib/hooks/useExpandedSelection.d.ts +23 -0
- package/lib/hooks/useExpandedSelection.js +37 -0
- package/lib/index.css +159 -74
- package/lib/index.d.ts +5 -2
- package/lib/index.js +9 -3
- package/lib/types.d.ts +3 -0
- package/lib/types.js +2 -0
- package/lib/ui/Button/Button.d.ts +11 -0
- package/lib/ui/{ToolbarButton/ToolbarButton.js → Button/Button.js} +6 -3
- package/lib/ui/Fields/Input/Input.d.ts +5 -0
- package/lib/ui/{Inputs/Text/TextInput.js → Fields/Input/Input.js} +10 -5
- package/lib/ui/Modal/Modal.js +2 -1
- package/lib/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.d.ts +9 -0
- package/lib/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.js +165 -0
- package/lib/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.d.ts +9 -0
- package/lib/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.js +129 -0
- package/lib/utils/undefinedIfEmpty.d.ts +1 -0
- package/lib/utils/undefinedIfEmpty.js +7 -0
- package/package.json +9 -4
- package/src/Editor/Editor.spec.tsx +78 -18
- package/src/Editor/Editor.tsx +28 -9
- package/src/Editor/EditorContext.spec.tsx +26 -0
- package/src/Editor/EditorContext.ts +19 -0
- package/src/Editor/_editor.scss +20 -51
- package/src/EditorToolbar/FloatingToolbar.spec.tsx +2 -3
- package/src/EditorToolbar/FloatingToolbar.tsx +15 -6
- package/src/EditorToolbar/Toolbar.tsx +2 -0
- package/src/EditorToolbar/Tools/Bold/BoldButton.spec.tsx +1 -1
- package/src/EditorToolbar/Tools/Bold/BoldButton.tsx +2 -2
- package/src/EditorToolbar/Tools/Image/Form/ImageForm.spec.tsx +77 -0
- package/src/EditorToolbar/Tools/Image/Form/ImageForm.tsx +90 -0
- package/src/EditorToolbar/Tools/Image/ImageButton.spec.tsx +135 -0
- package/src/EditorToolbar/Tools/Image/ImageButton.tsx +72 -0
- package/src/EditorToolbar/Tools/Image/ImageModal.spec.tsx +83 -0
- package/src/EditorToolbar/Tools/Image/ImageModal.tsx +24 -0
- package/src/EditorToolbar/Tools/Italic/ItalicButton.spec.tsx +1 -1
- package/src/EditorToolbar/Tools/Italic/ItalicButton.tsx +2 -2
- package/src/EditorToolbar/Tools/Link/Form/LinkForm.spec.tsx +37 -9
- package/src/EditorToolbar/Tools/Link/Form/LinkForm.tsx +97 -27
- package/src/EditorToolbar/Tools/Link/LinkButton.spec.tsx +104 -26
- package/src/EditorToolbar/Tools/Link/LinkButton.tsx +30 -21
- package/src/EditorToolbar/Tools/Link/LinkModal.tsx +13 -6
- package/src/EditorToolbar/Tools/Link/RemoveLinkButton.spec.tsx +26 -26
- package/src/EditorToolbar/Tools/Link/RemoveLinkButton.tsx +4 -12
- package/src/EditorToolbar/Tools/Redo/RedoButton.tsx +2 -2
- package/src/EditorToolbar/Tools/TextAlign/CenterAlign/CenterAlignButton.tsx +2 -2
- package/src/EditorToolbar/Tools/TextAlign/JustifyAlign/JustifyAlignButton.tsx +2 -2
- package/src/EditorToolbar/Tools/TextAlign/LeftAlign/LeftAlignButton.tsx +2 -2
- package/src/EditorToolbar/Tools/TextAlign/RightAlign/RightAlignButton.tsx +2 -2
- package/src/EditorToolbar/Tools/Underline/Underline.spec.tsx +1 -1
- package/src/EditorToolbar/Tools/Underline/UnderlineButton.tsx +2 -2
- package/src/EditorToolbar/Tools/Undo/UndoButton.spec.tsx +22 -1
- package/src/EditorToolbar/Tools/Undo/UndoButton.tsx +2 -2
- package/src/EditorToolbar/_floating-toolbar.scss +5 -0
- package/src/EditorToolbar/_toolbar.scss +11 -5
- package/src/Extensions/CommandsExtension/CommandsExtension.ts +54 -0
- package/src/Extensions/Extensions.ts +32 -17
- package/src/Extensions/ImageExtension/ImageExtension.ts +112 -0
- package/src/Extensions/LinkExtension/AssetLinkExtension.spec.ts +104 -0
- package/src/Extensions/LinkExtension/AssetLinkExtension.ts +128 -0
- package/src/Extensions/LinkExtension/LinkExtension.spec.ts +68 -0
- package/src/Extensions/LinkExtension/LinkExtension.ts +88 -82
- package/src/Extensions/LinkExtension/common.ts +10 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useExpandedSelection.ts +44 -0
- package/src/index.scss +2 -2
- package/src/index.ts +5 -2
- package/src/types.ts +5 -0
- package/src/ui/Button/Button.spec.tsx +44 -0
- package/src/ui/Button/Button.tsx +29 -0
- package/src/ui/{_buttons.scss → Button/_button.scss} +19 -1
- package/src/ui/{Inputs/Text/TextInput.spec.tsx → Fields/Input/Input.spec.tsx} +8 -8
- package/src/ui/Fields/Input/Input.tsx +34 -0
- package/src/ui/Modal/Modal.tsx +2 -1
- package/src/ui/ToolbarDropdown/_toolbar-dropdown.scss +1 -1
- package/src/ui/_forms.scss +14 -0
- package/src/ui/_typography.scss +46 -0
- package/src/utils/converters/mocks/squizNodeJson.mock.ts +252 -0
- package/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.spec.ts +480 -0
- package/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.ts +202 -0
- package/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.spec.ts +329 -0
- package/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.ts +151 -0
- package/src/utils/undefinedIfEmpty.spec.ts +12 -0
- package/src/utils/undefinedIfEmpty.ts +3 -0
- package/tailwind.config.cjs +3 -0
- package/tests/renderWithEditor.tsx +28 -15
- package/lib/FormattedTextEditor.d.ts +0 -2
- package/lib/FormattedTextEditor.js +0 -7
- package/lib/ui/Inputs/Text/TextInput.d.ts +0 -4
- package/lib/ui/ToolbarButton/ToolbarButton.d.ts +0 -10
- package/src/Editor/Editor.mock.tsx +0 -43
- package/src/FormattedTextEditor.spec.tsx +0 -10
- package/src/FormattedTextEditor.tsx +0 -3
- package/src/ui/Inputs/Text/TextInput.tsx +0 -20
- package/src/ui/ToolbarButton/ToolbarButton.tsx +0 -26
- package/src/ui/ToolbarButton/_toolbar-button.scss +0 -17
- /package/lib/ui/{Inputs → Fields}/Select/Select.d.ts +0 -0
- /package/lib/ui/{Inputs → Fields}/Select/Select.js +0 -0
- /package/src/ui/{Inputs → Fields}/Select/Select.spec.tsx +0 -0
- /package/src/ui/{Inputs → Fields}/Select/Select.tsx +0 -0
package/demo/App.tsx
CHANGED
@@ -1,13 +1,26 @@
|
|
1
1
|
import React, { useState } from 'react';
|
2
|
-
import
|
2
|
+
import { Editor, EditorContext, remirrorNodeToSquizNode, squizNodeToRemirrorNode } from '../src';
|
3
3
|
import { RemirrorEventListener, Extension } from '@remirror/core';
|
4
|
+
import ReactDiffViewer from 'react-diff-viewer-continued';
|
4
5
|
|
5
6
|
function App() {
|
6
|
-
const [doc, setDoc] = useState(
|
7
|
+
const [doc, setDoc] = useState('');
|
8
|
+
const [squizDoc, setSquizDoc] = useState('');
|
9
|
+
const [reconvertedDoc, setReconvertedDoc] = useState('');
|
10
|
+
const [error, setError] = useState<unknown>(null);
|
7
11
|
const [editable, setEditable] = useState(true);
|
12
|
+
|
8
13
|
const handleEditorChange: RemirrorEventListener<Extension> = (parameter) => {
|
9
|
-
|
10
|
-
setDoc(parameter.state.doc);
|
14
|
+
try {
|
15
|
+
setDoc(JSON.stringify(parameter.state.doc, null, 2));
|
16
|
+
|
17
|
+
const newSquizDoc = remirrorNodeToSquizNode(parameter.state.doc);
|
18
|
+
const newReconvertedDoc = parameter.state.schema.nodeFromJSON(squizNodeToRemirrorNode(newSquizDoc));
|
19
|
+
|
20
|
+
setSquizDoc(JSON.stringify(newSquizDoc, null, 2));
|
21
|
+
setReconvertedDoc(JSON.stringify(newReconvertedDoc, null, 2));
|
22
|
+
} catch (e) {
|
23
|
+
setError(e);
|
11
24
|
}
|
12
25
|
};
|
13
26
|
|
@@ -22,15 +35,37 @@ function App() {
|
|
22
35
|
</div>
|
23
36
|
<h1>Editor</h1>
|
24
37
|
<div className="page-section">
|
25
|
-
<
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
38
|
+
<EditorContext.Provider
|
39
|
+
value={{
|
40
|
+
matrix: {
|
41
|
+
matrixDomain: 'https://matrix-domain.squiz.net',
|
42
|
+
matrixIdentifier: 'matrix-api-identifier',
|
43
|
+
isValidMatrixAssetId: (assetId: string) => {
|
44
|
+
return new Promise((resolve) => {
|
45
|
+
setTimeout(() => {
|
46
|
+
resolve(assetId.indexOf('invalid') < 0);
|
47
|
+
}, 200);
|
48
|
+
});
|
49
|
+
},
|
50
|
+
},
|
51
|
+
}}
|
52
|
+
>
|
53
|
+
<Editor
|
54
|
+
editable={editable}
|
55
|
+
content={`<p>Hello <a href="https://www.google.com"><strong>Mr Bean</strong></a>, nice to <a href="https://www.google.com">meet you</a>.<img src="https://media2.giphy.com/media/3o6ozsIxg5legYvggo/giphy.gif" height="150" width="200"/></p>`}
|
56
|
+
onChange={handleEditorChange}
|
57
|
+
/>
|
58
|
+
</EditorContext.Provider>
|
30
59
|
</div>
|
31
60
|
<h1>Document</h1>
|
32
61
|
<div className="page-section">
|
33
|
-
|
62
|
+
{error instanceof Error && (
|
63
|
+
<div className="error">An error occurred when transforming the document: {error.message}</div>
|
64
|
+
)}
|
65
|
+
<div className="code-section">
|
66
|
+
<ReactDiffViewer oldValue={doc} newValue={reconvertedDoc} splitView={false} showDiffOnly={false} />
|
67
|
+
<ReactDiffViewer oldValue={squizDoc} newValue={squizDoc} splitView={false} showDiffOnly={false} />
|
68
|
+
</div>
|
34
69
|
</div>
|
35
70
|
</div>
|
36
71
|
);
|
package/demo/index.scss
CHANGED
@@ -22,19 +22,20 @@ h1 {
|
|
22
22
|
align-items: center;
|
23
23
|
}
|
24
24
|
|
25
|
-
code {
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
font-size: 0.8rem;
|
31
|
-
height: 40vh;
|
32
|
-
max-height: 40vh;
|
25
|
+
.code-section {
|
26
|
+
display: flex;
|
27
|
+
flex-direction: row;
|
28
|
+
gap: 8px;
|
29
|
+
height: 35vh;
|
33
30
|
overflow: scroll;
|
34
31
|
}
|
35
32
|
|
36
33
|
.remirror-editor {
|
37
|
-
height:
|
38
|
-
max-height:
|
34
|
+
height: 35vh;
|
35
|
+
max-height: 35vh;
|
39
36
|
overflow: scroll;
|
40
37
|
}
|
38
|
+
|
39
|
+
.error {
|
40
|
+
color: red;
|
41
|
+
}
|
package/lib/Editor/Editor.js
CHANGED
@@ -1,15 +1,53 @@
|
|
1
1
|
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
2
25
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
27
|
};
|
5
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
const react_1 =
|
29
|
+
const react_1 = __importStar(require("react"));
|
7
30
|
const react_2 = require("@remirror/react");
|
8
31
|
const EditorToolbar_1 = require("../EditorToolbar");
|
32
|
+
const EditorContext_1 = require("./EditorContext");
|
9
33
|
const Extensions_1 = require("../Extensions/Extensions");
|
10
|
-
const
|
34
|
+
const clsx_1 = __importDefault(require("clsx"));
|
35
|
+
const WrappedEditor = () => {
|
36
|
+
const preventImagePaste = (0, react_1.useCallback)((event) => {
|
37
|
+
const { clipboardData } = event;
|
38
|
+
const pastedData = clipboardData?.files[0];
|
39
|
+
if (pastedData?.type && pastedData?.type.startsWith('image/')) {
|
40
|
+
event.preventDefault();
|
41
|
+
}
|
42
|
+
// Allow other paste event handlers to be run.
|
43
|
+
return false;
|
44
|
+
}, []);
|
45
|
+
(0, react_2.useEditorEvent)('paste', preventImagePaste);
|
46
|
+
return react_1.default.createElement(react_2.EditorComponent, null);
|
47
|
+
};
|
48
|
+
const Editor = ({ content, editable = true, onChange }) => {
|
11
49
|
const { manager, state, setState } = (0, react_2.useRemirror)({
|
12
|
-
extensions: Extensions_1.
|
50
|
+
extensions: (0, Extensions_1.createExtensions)((0, react_1.useContext)(EditorContext_1.EditorContext)),
|
13
51
|
content,
|
14
52
|
selection: 'start',
|
15
53
|
stringHandler: 'html',
|
@@ -19,10 +57,10 @@ const Editor = ({ content, editable, onChange }) => {
|
|
19
57
|
onChange?.(parameter);
|
20
58
|
};
|
21
59
|
return (react_1.default.createElement("div", { className: "squiz-fte-scope" },
|
22
|
-
react_1.default.createElement("div", { className:
|
60
|
+
react_1.default.createElement("div", { className: (0, clsx_1.default)('remirror-theme formatted-text-editor', !editable && 'formatted-text-editor--is-disabled') },
|
23
61
|
react_1.default.createElement(react_2.Remirror, { manager: manager, state: state, editable: editable, onChange: handleChange, placeholder: "Write something", label: "Text editor" },
|
24
|
-
react_1.default.createElement(EditorToolbar_1.Toolbar, null),
|
25
|
-
react_1.default.createElement(
|
26
|
-
react_1.default.createElement(EditorToolbar_1.FloatingToolbar, null)))));
|
62
|
+
editable && react_1.default.createElement(EditorToolbar_1.Toolbar, null),
|
63
|
+
react_1.default.createElement(WrappedEditor, null),
|
64
|
+
editable && react_1.default.createElement(EditorToolbar_1.FloatingToolbar, null)))));
|
27
65
|
};
|
28
66
|
exports.default = Editor;
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
export type EditorContextOptions = {
|
3
|
+
matrix: {
|
4
|
+
matrixIdentifier: string;
|
5
|
+
matrixDomain: string;
|
6
|
+
isValidMatrixAssetId: (assetId: string) => boolean | Promise<boolean>;
|
7
|
+
};
|
8
|
+
};
|
9
|
+
export declare const defaultEditorContext: EditorContextOptions;
|
10
|
+
export declare const EditorContext: React.Context<EditorContextOptions>;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.EditorContext = exports.defaultEditorContext = void 0;
|
7
|
+
const react_1 = __importDefault(require("react"));
|
8
|
+
exports.defaultEditorContext = {
|
9
|
+
matrix: {
|
10
|
+
matrixIdentifier: '',
|
11
|
+
matrixDomain: '',
|
12
|
+
isValidMatrixAssetId: () => true,
|
13
|
+
},
|
14
|
+
};
|
15
|
+
exports.EditorContext = react_1.default.createContext(exports.defaultEditorContext);
|
@@ -37,22 +37,28 @@ const LinkButton_1 = __importDefault(require("./Tools/Link/LinkButton"));
|
|
37
37
|
const react_2 = require("@remirror/react");
|
38
38
|
const react_components_1 = require("@remirror/react-components");
|
39
39
|
const createToolbarPositioner_1 = require("../utils/createToolbarPositioner");
|
40
|
-
|
40
|
+
const ImageButton_1 = __importDefault(require("./Tools/Image/ImageButton"));
|
41
|
+
const Extensions_1 = require("../Extensions/Extensions");
|
41
42
|
const FloatingToolbar = () => {
|
43
|
+
const watchedMarks = [Extensions_1.MarkName.Link, Extensions_1.MarkName.AssetLink];
|
42
44
|
const extensionNames = (0, hooks_1.useExtensionNames)();
|
43
|
-
const positioner = (0, react_1.useMemo)(() => (0, createToolbarPositioner_1.createToolbarPositioner)({ types:
|
44
|
-
const
|
45
|
+
const positioner = (0, react_1.useMemo)(() => (0, createToolbarPositioner_1.createToolbarPositioner)({ types: watchedMarks }), []);
|
46
|
+
const active = (0, react_2.useActive)();
|
47
|
+
const { data: { marks }, } = (0, react_2.usePositioner)(positioner, []);
|
45
48
|
let buttons = [
|
46
49
|
extensionNames.bold && react_1.default.createElement(BoldButton_1.default, { key: "bold" }),
|
47
50
|
extensionNames.italic && react_1.default.createElement(ItalicButton_1.default, { key: "italic" }),
|
48
51
|
extensionNames.underline && react_1.default.createElement(UnderlineButton_1.default, { key: "underline" }),
|
49
52
|
];
|
50
|
-
if (
|
53
|
+
if (active.image()) {
|
54
|
+
buttons = [react_1.default.createElement(ImageButton_1.default, { key: "add-image", inPopover: true })];
|
55
|
+
}
|
56
|
+
else if (marks?.[Extensions_1.MarkName.Link].isExclusivelyActive || marks?.[Extensions_1.MarkName.AssetLink].isExclusivelyActive) {
|
51
57
|
// if all of the selected text is a link show the options to update/remove the link instead of the regular
|
52
58
|
// formatting options.
|
53
59
|
buttons = [react_1.default.createElement(LinkButton_1.default, { key: "update-link", inPopover: true }), react_1.default.createElement(RemoveLinkButton_1.default, { key: "remove-link" })];
|
54
60
|
}
|
55
|
-
else if (!
|
61
|
+
else if (!marks?.[Extensions_1.MarkName.Link].isActive && !marks?.[Extensions_1.MarkName.AssetLink].isActive) {
|
56
62
|
// if none of the selected text is a link show the option to create a link.
|
57
63
|
buttons.push(react_1.default.createElement(react_components_1.VerticalDivider, { key: "link-divider", className: "editor-divider" }), react_1.default.createElement(LinkButton_1.default, { key: "add-link", inPopover: true }));
|
58
64
|
}
|
@@ -15,6 +15,7 @@ const RedoButton_1 = __importDefault(require("./Tools/Redo/RedoButton"));
|
|
15
15
|
const TextTypeDropdown_1 = __importDefault(require("./Tools/TextType/TextTypeDropdown"));
|
16
16
|
const hooks_1 = require("../hooks");
|
17
17
|
const LinkButton_1 = __importDefault(require("./Tools/Link/LinkButton"));
|
18
|
+
const ImageButton_1 = __importDefault(require("./Tools/Image/ImageButton"));
|
18
19
|
const Toolbar = () => {
|
19
20
|
const extensionNames = (0, hooks_1.useExtensionNames)();
|
20
21
|
return (react_1.default.createElement(react_components_1.Toolbar, { className: "remirror-toolbar editor-toolbar" },
|
@@ -27,6 +28,7 @@ const Toolbar = () => {
|
|
27
28
|
extensionNames.italic && react_1.default.createElement(ItalicButton_1.default, null),
|
28
29
|
extensionNames.underline && react_1.default.createElement(UnderlineButton_1.default, null),
|
29
30
|
extensionNames.nodeFormatting && react_1.default.createElement(TextAlignButtons_1.default, null),
|
30
|
-
extensionNames.link && react_1.default.createElement(LinkButton_1.default, null)
|
31
|
+
extensionNames.link && react_1.default.createElement(LinkButton_1.default, null),
|
32
|
+
extensionNames.image && react_1.default.createElement(ImageButton_1.default, null)));
|
31
33
|
};
|
32
34
|
exports.Toolbar = Toolbar;
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const react_1 = __importDefault(require("react"));
|
7
7
|
const react_2 = require("@remirror/react");
|
8
|
-
const
|
8
|
+
const Button_1 = __importDefault(require("../../../ui/Button/Button"));
|
9
9
|
const FormatBoldRounded_1 = __importDefault(require("@mui/icons-material/FormatBoldRounded"));
|
10
10
|
const BoldButton = () => {
|
11
11
|
const { toggleBold } = (0, react_2.useCommands)();
|
@@ -17,6 +17,6 @@ const BoldButton = () => {
|
|
17
17
|
chain.toggleBold().focus().run();
|
18
18
|
}
|
19
19
|
};
|
20
|
-
return (react_1.default.createElement(
|
20
|
+
return (react_1.default.createElement(Button_1.default, { handleOnClick: handleSelect, isDisabled: !enabled, isActive: active.bold(), icon: react_1.default.createElement(FormatBoldRounded_1.default, null), label: "Bold (cmd+B)" }));
|
21
21
|
};
|
22
22
|
exports.default = BoldButton;
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { ReactElement } from 'react';
|
2
|
+
import { SubmitHandler } from 'react-hook-form';
|
3
|
+
import { ImageAttributes } from '@remirror/extension-image/dist-types/image-extension';
|
4
|
+
export type UpdateImageOptions = ImageAttributes & {
|
5
|
+
src: string;
|
6
|
+
alt: string;
|
7
|
+
width: number;
|
8
|
+
height: number;
|
9
|
+
};
|
10
|
+
export type ImageFormData = Pick<UpdateImageOptions, 'src' | 'alt' | 'width' | 'height'>;
|
11
|
+
export type FormProps = {
|
12
|
+
data: Partial<ImageFormData>;
|
13
|
+
onSubmit: SubmitHandler<ImageFormData>;
|
14
|
+
};
|
15
|
+
export type Dimensions = 'width' | 'height';
|
16
|
+
declare const ImageForm: ({ data, onSubmit }: FormProps) => ReactElement;
|
17
|
+
export default ImageForm;
|
@@ -0,0 +1,82 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
27
|
+
};
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
29
|
+
const react_1 = __importStar(require("react"));
|
30
|
+
const Input_1 = require("../../../../ui/Fields/Input/Input");
|
31
|
+
const react_hook_form_1 = require("react-hook-form");
|
32
|
+
const react_image_size_1 = require("react-image-size");
|
33
|
+
const Button_1 = __importDefault(require("../../../../ui/Button/Button"));
|
34
|
+
const LinkOff_1 = __importDefault(require("@mui/icons-material/LinkOff"));
|
35
|
+
const InsertLinkRounded_1 = __importDefault(require("@mui/icons-material/InsertLinkRounded"));
|
36
|
+
const ImageForm = ({ data, onSubmit }) => {
|
37
|
+
const { register, handleSubmit, setValue } = (0, react_hook_form_1.useForm)({
|
38
|
+
defaultValues: data,
|
39
|
+
});
|
40
|
+
const [aspectRatioFromWidth, setAspectRatioFromWidth] = (0, react_1.useState)(9 / 16);
|
41
|
+
const [aspectRatioFromHeight, setAspectRatioFromHeight] = (0, react_1.useState)(16 / 9);
|
42
|
+
const [aspectRatioLocked, setAspectRatioLocked] = (0, react_1.useState)(true);
|
43
|
+
const setDimensionsFromURL = (e) => {
|
44
|
+
(0, react_image_size_1.getImageSize)(e.target.value)
|
45
|
+
.then(({ width, height }) => {
|
46
|
+
setValue('width', width);
|
47
|
+
setValue('height', height);
|
48
|
+
setAspectRatioFromWidth(height / width);
|
49
|
+
setAspectRatioFromHeight(width / height);
|
50
|
+
})
|
51
|
+
.catch(() => {
|
52
|
+
// TODO: we will use this when we add validation in a follow-up ticket
|
53
|
+
});
|
54
|
+
};
|
55
|
+
const calculateDimensions = () => {
|
56
|
+
if (aspectRatioLocked) {
|
57
|
+
const currentTarget = event?.target;
|
58
|
+
const type = currentTarget.name;
|
59
|
+
const currentValue = currentTarget.value;
|
60
|
+
const otherValue = type === 'width' ? 'height' : 'width';
|
61
|
+
const aspectRatio = type === 'width' ? aspectRatioFromWidth : aspectRatioFromHeight;
|
62
|
+
const newValue = Math.round(aspectRatio * Number(currentValue) * 100) / 100;
|
63
|
+
setValue(otherValue, newValue);
|
64
|
+
}
|
65
|
+
};
|
66
|
+
const toggleAspectRatio = () => {
|
67
|
+
setAspectRatioLocked(!aspectRatioLocked);
|
68
|
+
};
|
69
|
+
return (react_1.default.createElement("form", { className: "squiz-fte-form", onSubmit: handleSubmit(onSubmit) },
|
70
|
+
react_1.default.createElement("div", { className: "squiz-fte-form-group mb-2" },
|
71
|
+
react_1.default.createElement(Input_1.Input, { label: "Source", ...register('src', { onChange: setDimensionsFromURL }) })),
|
72
|
+
react_1.default.createElement("div", { className: "squiz-fte-form-group mb-2" },
|
73
|
+
react_1.default.createElement(Input_1.Input, { label: "Alternative description", ...register('alt') })),
|
74
|
+
react_1.default.createElement("div", { className: "flex flex-row items-end" },
|
75
|
+
react_1.default.createElement("div", { className: "squiz-fte-form-group mb-2" },
|
76
|
+
react_1.default.createElement(Input_1.Input, { label: "Width", ...register('width'), type: "number", name: "width", onChange: calculateDimensions })),
|
77
|
+
react_1.default.createElement("div", { className: "flex mx-1 mb-2" },
|
78
|
+
react_1.default.createElement(Button_1.default, { handleOnClick: toggleAspectRatio, isActive: false, icon: aspectRatioLocked ? react_1.default.createElement(InsertLinkRounded_1.default, null) : react_1.default.createElement(LinkOff_1.default, null), label: "Constrain properties", isDisabled: false })),
|
79
|
+
react_1.default.createElement("div", { className: "squiz-fte-form-group mb-2" },
|
80
|
+
react_1.default.createElement(Input_1.Input, { label: "Height", ...register('height'), type: "number", name: "height", onChange: calculateDimensions })))));
|
81
|
+
};
|
82
|
+
exports.default = ImageForm;
|
@@ -0,0 +1,77 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
27
|
+
};
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
29
|
+
const react_1 = __importStar(require("react"));
|
30
|
+
const ImageRounded_1 = __importDefault(require("@mui/icons-material/ImageRounded"));
|
31
|
+
const ImageModal_1 = __importDefault(require("./ImageModal"));
|
32
|
+
const Button_1 = __importDefault(require("../../../ui/Button/Button"));
|
33
|
+
const react_2 = require("@remirror/react");
|
34
|
+
const createToolbarPositioner_1 = require("../../../utils/createToolbarPositioner");
|
35
|
+
const ImageButton = ({ inPopover = false }) => {
|
36
|
+
const [showModal, setShowModal] = (0, react_1.useState)(false);
|
37
|
+
const { insertImage } = (0, react_2.useCommands)();
|
38
|
+
const active = (0, react_2.useActive)();
|
39
|
+
const positioner = (0, react_1.useMemo)(() => (0, createToolbarPositioner_1.createToolbarPositioner)({ types: ['link'] }), []);
|
40
|
+
const { data } = (0, react_2.usePositioner)(positioner, []);
|
41
|
+
// if the active selection is not an image, disable the button as it means it will be text
|
42
|
+
const disabled = data.isSelectionInView && !active.image() ? true : false;
|
43
|
+
const handleClick = () => {
|
44
|
+
if (!showModal) {
|
45
|
+
// form element are uncontrolled, let the event loop run to
|
46
|
+
// update the selected text in state before showing the modal.
|
47
|
+
requestAnimationFrame(() => {
|
48
|
+
setShowModal(true);
|
49
|
+
});
|
50
|
+
}
|
51
|
+
};
|
52
|
+
const insertImageFromData = (data) => {
|
53
|
+
const { src, alt, width, height } = data;
|
54
|
+
if (src) {
|
55
|
+
insertImage({ src, alt, width, height });
|
56
|
+
}
|
57
|
+
};
|
58
|
+
const handleSubmit = (data) => {
|
59
|
+
insertImageFromData(data);
|
60
|
+
setShowModal(false);
|
61
|
+
};
|
62
|
+
const handleShortcut = (0, react_1.useCallback)(() => {
|
63
|
+
handleClick();
|
64
|
+
// Prevent other key handlers being run
|
65
|
+
return true;
|
66
|
+
}, []);
|
67
|
+
// when Ctrl+l is pressed show the modal, only registered in the toolbar button instance to avoid the key press
|
68
|
+
// being double handled.
|
69
|
+
if (!inPopover) {
|
70
|
+
// disable the shortcut if the button is disabled
|
71
|
+
(0, react_2.useKeymap)('Mod-l', disabled ? () => false : handleShortcut);
|
72
|
+
}
|
73
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
74
|
+
react_1.default.createElement(Button_1.default, { handleOnClick: handleClick, isActive: active.image(), icon: react_1.default.createElement(ImageRounded_1.default, null), label: "Image (cmd+L)", isDisabled: disabled }),
|
75
|
+
showModal && react_1.default.createElement(ImageModal_1.default, { onCancel: () => setShowModal(false), onSubmit: handleSubmit })));
|
76
|
+
};
|
77
|
+
exports.default = ImageButton;
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import { ImageFormData } from './Form/ImageForm';
|
2
|
+
import { SubmitHandler } from 'react-hook-form';
|
3
|
+
type ImageModalProps = {
|
4
|
+
onCancel: () => void;
|
5
|
+
onSubmit: SubmitHandler<ImageFormData>;
|
6
|
+
};
|
7
|
+
declare const ImageModal: ({ onCancel, onSubmit }: ImageModalProps) => JSX.Element;
|
8
|
+
export default ImageModal;
|
@@ -0,0 +1,16 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const ImageForm_1 = __importDefault(require("./Form/ImageForm"));
|
7
|
+
const react_1 = __importDefault(require("react"));
|
8
|
+
const react_2 = require("@remirror/react");
|
9
|
+
const FormModal_1 = __importDefault(require("../../../ui/Modal/FormModal"));
|
10
|
+
const ImageModal = ({ onCancel, onSubmit }) => {
|
11
|
+
const selection = (0, react_2.useCurrentSelection)();
|
12
|
+
const currentImage = selection?.node;
|
13
|
+
return (react_1.default.createElement(FormModal_1.default, { title: "Image", onCancel: onCancel },
|
14
|
+
react_1.default.createElement(ImageForm_1.default, { data: { ...currentImage?.attrs, src: currentImage?.attrs.src }, onSubmit: onSubmit })));
|
15
|
+
};
|
16
|
+
exports.default = ImageModal;
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const react_1 = __importDefault(require("react"));
|
7
7
|
const react_2 = require("@remirror/react");
|
8
|
-
const
|
8
|
+
const Button_1 = __importDefault(require("../../../ui/Button/Button"));
|
9
9
|
const FormatItalicRounded_1 = __importDefault(require("@mui/icons-material/FormatItalicRounded"));
|
10
10
|
const ItalicButton = () => {
|
11
11
|
const { toggleItalic } = (0, react_2.useCommands)();
|
@@ -17,6 +17,6 @@ const ItalicButton = () => {
|
|
17
17
|
chain.toggleItalic().focus().run();
|
18
18
|
}
|
19
19
|
};
|
20
|
-
return (react_1.default.createElement(
|
20
|
+
return (react_1.default.createElement(Button_1.default, { handleOnClick: handleSelect, isDisabled: !enabled, isActive: active.italic(), icon: react_1.default.createElement(FormatItalicRounded_1.default, null), label: "Italic (cmd+I)" }));
|
21
21
|
};
|
22
22
|
exports.default = ItalicButton;
|
@@ -1,10 +1,19 @@
|
|
1
1
|
import { ReactElement } from 'react';
|
2
2
|
import { SubmitHandler } from 'react-hook-form';
|
3
|
-
import {
|
4
|
-
|
3
|
+
import { FromToProps } from 'remirror';
|
4
|
+
import { UpdateLinkProps } from '../../../../Extensions/LinkExtension/LinkExtension';
|
5
|
+
import { UpdateAssetLinkProps } from '../../../../Extensions/LinkExtension/AssetLinkExtension';
|
6
|
+
import { MarkName } from '../../../../Extensions/Extensions';
|
7
|
+
import { DeepPartial } from '../../../../types';
|
8
|
+
export type LinkFormData = {
|
9
|
+
linkType: MarkName;
|
10
|
+
text: string;
|
11
|
+
link: UpdateLinkProps['attrs'];
|
12
|
+
assetLink: UpdateAssetLinkProps['attrs'];
|
13
|
+
range: FromToProps;
|
14
|
+
};
|
5
15
|
export type FormProps = {
|
6
|
-
data
|
16
|
+
data?: DeepPartial<LinkFormData>;
|
7
17
|
onSubmit: SubmitHandler<LinkFormData>;
|
8
18
|
};
|
9
|
-
declare const LinkForm: ({ data, onSubmit }: FormProps) => ReactElement;
|
10
|
-
export default LinkForm;
|
19
|
+
export declare const LinkForm: ({ data, onSubmit }: FormProps) => ReactElement;
|
@@ -1,28 +1,80 @@
|
|
1
1
|
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
2
25
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
27
|
};
|
5
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
|
7
|
-
const
|
8
|
-
const
|
29
|
+
exports.LinkForm = void 0;
|
30
|
+
const react_1 = __importStar(require("react"));
|
31
|
+
const clsx_1 = __importDefault(require("clsx"));
|
9
32
|
const react_hook_form_1 = require("react-hook-form");
|
10
|
-
const
|
11
|
-
|
12
|
-
|
33
|
+
const Input_1 = require("../../../../ui/Fields/Input/Input");
|
34
|
+
const Select_1 = require("../../../../ui/Fields/Select/Select");
|
35
|
+
const common_1 = require("../../../../Extensions/LinkExtension/common");
|
36
|
+
const EditorContext_1 = require("../../../../Editor/EditorContext");
|
37
|
+
const Extensions_1 = require("../../../../Extensions/Extensions");
|
38
|
+
const linkTypeOptions = {
|
39
|
+
[Extensions_1.MarkName.Link]: { label: 'Link to URL' },
|
40
|
+
[Extensions_1.MarkName.AssetLink]: { label: 'Link to asset' },
|
41
|
+
};
|
42
|
+
const targetOptions = {
|
43
|
+
[common_1.LinkTarget.Self]: { label: 'Current window' },
|
44
|
+
[common_1.LinkTarget.Blank]: { label: 'New window' },
|
13
45
|
};
|
14
46
|
const LinkForm = ({ data, onSubmit }) => {
|
15
|
-
const
|
47
|
+
const context = (0, react_1.useContext)(EditorContext_1.EditorContext);
|
48
|
+
const { register, handleSubmit, setValue, watch, formState: { errors }, } = (0, react_hook_form_1.useForm)({
|
16
49
|
defaultValues: data,
|
17
50
|
});
|
51
|
+
const linkType = watch('linkType') || Extensions_1.MarkName.Link;
|
18
52
|
return (react_1.default.createElement("form", { className: "squiz-fte-form", onSubmit: handleSubmit(onSubmit) },
|
19
53
|
react_1.default.createElement("div", { className: "squiz-fte-form-group mb-2" },
|
20
|
-
react_1.default.createElement(
|
21
|
-
react_1.default.createElement(
|
22
|
-
react_1.default.createElement(
|
23
|
-
|
24
|
-
react_1.default.createElement(
|
25
|
-
|
26
|
-
react_1.default.createElement(
|
54
|
+
react_1.default.createElement(Select_1.Select, { name: "linkType", label: "Type", value: linkType, options: linkTypeOptions, onChange: (value) => setValue('linkType', value) })),
|
55
|
+
linkType === Extensions_1.MarkName.Link && (react_1.default.createElement(react_1.default.Fragment, null,
|
56
|
+
react_1.default.createElement("div", { className: (0, clsx_1.default)('squiz-fte-form-group mb-2') },
|
57
|
+
react_1.default.createElement(Input_1.Input, { label: "URL", ...register('link.href') })),
|
58
|
+
react_1.default.createElement("div", { className: (0, clsx_1.default)('squiz-fte-form-group mb-2') },
|
59
|
+
react_1.default.createElement(Input_1.Input, { label: "Text", ...register('text') })),
|
60
|
+
react_1.default.createElement("div", { className: (0, clsx_1.default)('squiz-fte-form-group mb-2') },
|
61
|
+
react_1.default.createElement(Input_1.Input, { label: "Title", ...register('link.title') })),
|
62
|
+
react_1.default.createElement("div", { className: (0, clsx_1.default)('squiz-fte-form-group mb-0') },
|
63
|
+
react_1.default.createElement(Select_1.Select, { name: "link.target", label: "Target", value: data?.link?.target || '_self', options: targetOptions, onChange: (value) => setValue('link.target', value) })))),
|
64
|
+
linkType === Extensions_1.MarkName.AssetLink && (react_1.default.createElement(react_1.default.Fragment, null,
|
65
|
+
react_1.default.createElement("div", { className: (0, clsx_1.default)('squiz-fte-form-group mb-2') },
|
66
|
+
react_1.default.createElement(Input_1.Input, { label: "Asset ID", error: errors?.assetLink?.matrixAssetId?.message, ...register('assetLink.matrixAssetId', {
|
67
|
+
validate: {
|
68
|
+
isValidAsset: async (assetId) => {
|
69
|
+
if (assetId && !(await context.matrix.isValidMatrixAssetId(assetId))) {
|
70
|
+
return 'Invalid asset ID';
|
71
|
+
}
|
72
|
+
},
|
73
|
+
},
|
74
|
+
}) })),
|
75
|
+
react_1.default.createElement("div", { className: (0, clsx_1.default)('squiz-fte-form-group mb-2') },
|
76
|
+
react_1.default.createElement(Input_1.Input, { label: "Text", ...register('text') })),
|
77
|
+
react_1.default.createElement("div", { className: (0, clsx_1.default)('squiz-fte-form-group mb-0') },
|
78
|
+
react_1.default.createElement(Select_1.Select, { name: "assetLink.target", label: "Target", value: data?.link?.target || '_self', options: targetOptions, onChange: (value) => setValue('assetLink.target', value) }))))));
|
27
79
|
};
|
28
|
-
exports.
|
80
|
+
exports.LinkForm = LinkForm;
|