@elliemae/ds-wysiwygeditor 2.2.0 → 2.3.0-alpha.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.
- package/cjs/DSWYSIWYGEditor.js +83 -72
- package/cjs/DSWYSIWYGEditor.js.map +7 -0
- package/cjs/components/CustomImageUploader.js +92 -94
- package/cjs/components/CustomImageUploader.js.map +7 -0
- package/cjs/components/CustomToolbar.js +172 -193
- package/cjs/components/CustomToolbar.js.map +7 -0
- package/cjs/components/DSWYSIWYGEditorImpl.js +147 -185
- package/cjs/components/DSWYSIWYGEditorImpl.js.map +7 -0
- package/cjs/components/ImageLibraryModal.js +75 -55
- package/cjs/components/ImageLibraryModal.js.map +7 -0
- package/cjs/components/InsertFieldModal.js +109 -142
- package/cjs/components/InsertFieldModal.js.map +7 -0
- package/cjs/components/TippedButton.js +56 -54
- package/cjs/components/TippedButton.js.map +7 -0
- package/cjs/components/TippedSelect.js +50 -39
- package/cjs/components/TippedSelect.js.map +7 -0
- package/cjs/components/colors.js +41 -21
- package/cjs/components/colors.js.map +7 -0
- package/cjs/components/customFields.js +66 -47
- package/cjs/components/customFields.js.map +7 -0
- package/cjs/constants.js +112 -38
- package/cjs/constants.js.map +7 -0
- package/cjs/index.js +39 -21
- package/cjs/index.js.map +7 -0
- package/cjs/quillMatchers/clipboardLinkWithTagMatcher.js +37 -22
- package/cjs/quillMatchers/clipboardLinkWithTagMatcher.js.map +7 -0
- package/cjs/quillOverrides/IndentStyle.js +41 -19
- package/cjs/quillOverrides/IndentStyle.js.map +7 -0
- package/cjs/quillOverrides/LinkFormat.js +57 -39
- package/cjs/quillOverrides/LinkFormat.js.map +7 -0
- package/cjs/quillOverrides/PlainClipboard.js +41 -21
- package/cjs/quillOverrides/PlainClipboard.js.map +7 -0
- package/cjs/utils.js +41 -18
- package/cjs/utils.js.map +7 -0
- package/esm/DSWYSIWYGEditor.js +50 -58
- package/esm/DSWYSIWYGEditor.js.map +7 -0
- package/esm/components/CustomImageUploader.js +60 -81
- package/esm/components/CustomImageUploader.js.map +7 -0
- package/esm/components/CustomToolbar.js +145 -184
- package/esm/components/CustomToolbar.js.map +7 -0
- package/esm/components/DSWYSIWYGEditorImpl.js +113 -169
- package/esm/components/DSWYSIWYGEditorImpl.js.map +7 -0
- package/esm/components/ImageLibraryModal.js +46 -47
- package/esm/components/ImageLibraryModal.js.map +7 -0
- package/esm/components/InsertFieldModal.js +72 -124
- package/esm/components/InsertFieldModal.js.map +7 -0
- package/esm/components/TippedButton.js +27 -44
- package/esm/components/TippedButton.js.map +7 -0
- package/esm/components/TippedSelect.js +21 -31
- package/esm/components/TippedSelect.js.map +7 -0
- package/esm/components/colors.js +12 -17
- package/esm/components/colors.js.map +7 -0
- package/esm/components/customFields.js +38 -40
- package/esm/components/customFields.js.map +7 -0
- package/esm/constants.js +83 -30
- package/esm/constants.js.map +7 -0
- package/esm/index.js +10 -4
- package/esm/index.js.map +7 -0
- package/esm/quillMatchers/clipboardLinkWithTagMatcher.js +8 -18
- package/esm/quillMatchers/clipboardLinkWithTagMatcher.js.map +7 -0
- package/esm/quillOverrides/IndentStyle.js +12 -17
- package/esm/quillOverrides/IndentStyle.js.map +7 -0
- package/esm/quillOverrides/LinkFormat.js +28 -37
- package/esm/quillOverrides/LinkFormat.js.map +7 -0
- package/esm/quillOverrides/PlainClipboard.js +12 -19
- package/esm/quillOverrides/PlainClipboard.js.map +7 -0
- package/esm/utils.js +12 -14
- package/esm/utils.js.map +7 -0
- package/package.json +9 -9
|
@@ -1,199 +1,163 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
var
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
var
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
var
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __reExport = (target, module2, copyDefault, desc) => {
|
|
13
|
+
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(module2))
|
|
15
|
+
if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default"))
|
|
16
|
+
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return target;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (module2, isNodeMode) => {
|
|
21
|
+
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", !isNodeMode && module2 && module2.__esModule ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
|
|
22
|
+
};
|
|
23
|
+
var __toCommonJS = /* @__PURE__ */ ((cache) => {
|
|
24
|
+
return (module2, temp) => {
|
|
25
|
+
return cache && cache.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache && cache.set(module2, temp), temp);
|
|
26
|
+
};
|
|
27
|
+
})(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0);
|
|
28
|
+
var DSWYSIWYGEditorImpl_exports = {};
|
|
29
|
+
__export(DSWYSIWYGEditorImpl_exports, {
|
|
30
|
+
default: () => DSWYSIWYGEditorImpl
|
|
31
|
+
});
|
|
32
|
+
var React = __toESM(require("react"));
|
|
33
|
+
var import_react = __toESM(require("react"));
|
|
34
|
+
var import_react_quill = __toESM(require("react-quill"));
|
|
35
|
+
var import_quill_blot_formatter = __toESM(require("quill-blot-formatter"));
|
|
36
|
+
var import_ImageLibraryModal = __toESM(require("./ImageLibraryModal"));
|
|
37
|
+
var import_InsertFieldModal = __toESM(require("./InsertFieldModal"));
|
|
38
|
+
var import_CustomToolbar = require("./CustomToolbar");
|
|
39
|
+
var import_IndentStyle = __toESM(require("../quillOverrides/IndentStyle"));
|
|
40
|
+
var import_LinkFormat = __toESM(require("../quillOverrides/LinkFormat"));
|
|
41
|
+
var import_utils = require("../utils");
|
|
42
|
+
var import_clipboardLinkWithTagMatcher = require("../quillMatchers/clipboardLinkWithTagMatcher");
|
|
43
|
+
import_react_quill.Quill.register("modules/blotFormatter", import_quill_blot_formatter.default);
|
|
44
|
+
const AlignStyle = import_react_quill.Quill.import("attributors/style/align");
|
|
45
|
+
const FontStyle = import_react_quill.Quill.import("attributors/style/font");
|
|
46
|
+
FontStyle.whitelist = [
|
|
47
|
+
"serif",
|
|
48
|
+
"monospace",
|
|
49
|
+
"arial",
|
|
50
|
+
"comic-sans",
|
|
51
|
+
"courier-new",
|
|
52
|
+
"georgia",
|
|
53
|
+
"helvetica",
|
|
54
|
+
"lucida"
|
|
55
|
+
];
|
|
56
|
+
const SizeStyle = import_react_quill.Quill.import("attributors/style/size");
|
|
57
|
+
SizeStyle.whitelist = [
|
|
58
|
+
"x-small",
|
|
59
|
+
"large",
|
|
60
|
+
"x-large"
|
|
61
|
+
];
|
|
62
|
+
const Block = import_react_quill.Quill.import("blots/block");
|
|
63
|
+
Block.tagName = "p";
|
|
64
|
+
import_react_quill.Quill.register(Block);
|
|
65
|
+
import_react_quill.Quill.register(AlignStyle, true);
|
|
66
|
+
import_react_quill.Quill.register(import_IndentStyle.default, true);
|
|
67
|
+
import_react_quill.Quill.register(FontStyle, true);
|
|
68
|
+
import_react_quill.Quill.register(SizeStyle, true);
|
|
69
|
+
class DSWYSIWYGEditorImpl extends import_react.default.PureComponent {
|
|
58
70
|
constructor(props) {
|
|
59
71
|
super(props);
|
|
60
|
-
this.quillModules =
|
|
72
|
+
this.quillModules = {
|
|
61
73
|
toolbar: {
|
|
62
|
-
container: this.props.toolbarContainer ?
|
|
63
|
-
handlers:
|
|
74
|
+
container: this.props.toolbarContainer ? `#${this.props.toolbarContainer}` : "#toolbar",
|
|
75
|
+
handlers: {
|
|
76
|
+
...this.props.toolbarHandlers
|
|
77
|
+
}
|
|
64
78
|
},
|
|
65
79
|
clipboard: {
|
|
66
|
-
// toggle to add extra line breaks when pasting HTML:
|
|
67
80
|
matchVisual: false
|
|
68
81
|
},
|
|
69
|
-
blotFormatter: {
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
|
|
82
|
+
blotFormatter: {},
|
|
83
|
+
...this.props.quillModules
|
|
84
|
+
};
|
|
73
85
|
this.onChangeQuill = (html, delta, source, editor) => {
|
|
74
|
-
const {
|
|
75
|
-
|
|
76
|
-
onChange
|
|
77
|
-
} = this.props;
|
|
78
|
-
if (!showRawHTML) onChange(html, delta, source, editor);
|
|
86
|
+
const { showRawHTML, onChange } = this.props;
|
|
87
|
+
if (!showRawHTML)
|
|
88
|
+
onChange(html, delta, source, editor);
|
|
79
89
|
};
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
onChange
|
|
85
|
-
} = this.props;
|
|
86
|
-
if (showRawHTML) onChange(e.target.value);
|
|
90
|
+
this.onChangeTextArea = (e) => {
|
|
91
|
+
const { showRawHTML, onChange } = this.props;
|
|
92
|
+
if (showRawHTML)
|
|
93
|
+
onChange(e.target.value);
|
|
87
94
|
};
|
|
88
|
-
|
|
89
|
-
this.onInserFieldConfirm = fieldCode => {
|
|
95
|
+
this.onInserFieldConfirm = (fieldCode) => {
|
|
90
96
|
const editor = this.getEditor();
|
|
91
97
|
const range = editor.getSelection(true);
|
|
92
98
|
editor.insertText(range.index, fieldCode);
|
|
93
99
|
};
|
|
94
|
-
|
|
95
|
-
this.onImageConfirm = image => {
|
|
100
|
+
this.onImageConfirm = (image) => {
|
|
96
101
|
if (!image) {
|
|
97
102
|
return;
|
|
98
103
|
}
|
|
99
|
-
|
|
100
104
|
const editor = this.getEditor();
|
|
101
105
|
const range = editor.getSelection(true);
|
|
102
|
-
editor.insertEmbed(range.index,
|
|
106
|
+
editor.insertEmbed(range.index, "image", image.url);
|
|
103
107
|
};
|
|
104
|
-
|
|
105
108
|
this.onFieldModalClose = () => {
|
|
106
|
-
this.setState({
|
|
107
|
-
isFieldModalOpen: false
|
|
108
|
-
});
|
|
109
|
+
this.setState({ isFieldModalOpen: false });
|
|
109
110
|
};
|
|
110
|
-
|
|
111
111
|
this.onImageModalClose = () => {
|
|
112
|
-
this.setState({
|
|
113
|
-
isImageModalOpen: false
|
|
114
|
-
});
|
|
112
|
+
this.setState({ isImageModalOpen: false });
|
|
115
113
|
};
|
|
116
|
-
|
|
117
|
-
this.quillRef = ref => {
|
|
114
|
+
this.quillRef = (ref) => {
|
|
118
115
|
this.quill = ref;
|
|
119
116
|
};
|
|
120
|
-
|
|
121
|
-
ReactQuill.Quill.register(LinkFormat, true);
|
|
122
|
-
|
|
117
|
+
import_react_quill.Quill.register(import_LinkFormat.default, true);
|
|
123
118
|
if (props.quillOverrides.length) {
|
|
124
|
-
props.quillOverrides.map(override =>
|
|
119
|
+
props.quillOverrides.map((override) => import_react_quill.Quill.register(override, true));
|
|
125
120
|
}
|
|
126
|
-
|
|
127
121
|
this.state = {
|
|
128
122
|
isImageModalOpen: false,
|
|
129
123
|
isFieldModalOpen: false
|
|
130
124
|
};
|
|
131
|
-
const {
|
|
132
|
-
toolbar
|
|
133
|
-
} = this.quillModules;
|
|
134
|
-
|
|
125
|
+
const { toolbar } = this.quillModules;
|
|
135
126
|
if (props.imagesData) {
|
|
136
|
-
toolbar.handlers.image = value => {
|
|
137
|
-
const {
|
|
138
|
-
imagesData,
|
|
139
|
-
handleImageClick
|
|
140
|
-
} = this.props;
|
|
141
|
-
|
|
127
|
+
toolbar.handlers.image = (value) => {
|
|
128
|
+
const { imagesData, handleImageClick } = this.props;
|
|
142
129
|
if (!imagesData.length) {
|
|
143
130
|
return;
|
|
144
131
|
}
|
|
145
|
-
|
|
146
|
-
this.setState({
|
|
147
|
-
isImageModalOpen: !!value
|
|
148
|
-
});
|
|
132
|
+
this.setState({ isImageModalOpen: !!value });
|
|
149
133
|
handleImageClick(value);
|
|
150
134
|
};
|
|
151
135
|
}
|
|
152
|
-
|
|
153
136
|
if (props.customFields) {
|
|
154
|
-
toolbar.handlers.customFields = value => {
|
|
155
|
-
const {
|
|
156
|
-
customFields,
|
|
157
|
-
handleCustomFieldClick
|
|
158
|
-
} = this.props;
|
|
159
|
-
|
|
137
|
+
toolbar.handlers.customFields = (value) => {
|
|
138
|
+
const { customFields, handleCustomFieldClick } = this.props;
|
|
160
139
|
if (!customFields.length) {
|
|
161
140
|
return;
|
|
162
141
|
}
|
|
163
|
-
|
|
164
|
-
this.setState({
|
|
165
|
-
isFieldModalOpen: !!value
|
|
166
|
-
});
|
|
142
|
+
this.setState({ isFieldModalOpen: !!value });
|
|
167
143
|
handleCustomFieldClick(value);
|
|
168
144
|
};
|
|
169
145
|
}
|
|
170
146
|
}
|
|
171
|
-
|
|
172
147
|
componentDidMount() {
|
|
173
|
-
// this.quill doesn't exist untill the full call-stack execute
|
|
174
|
-
// we need to "setTimeout" so this componentDidMount work as expected
|
|
175
148
|
setTimeout(() => {
|
|
176
149
|
const quillDomRef = this.quill;
|
|
177
150
|
const editor = quillDomRef.getEditor();
|
|
178
|
-
this.props.getQuillRef(quillDomRef);
|
|
179
|
-
|
|
180
|
-
editor.clipboard.addMatcher('a', clipboardLinkWithTagMatcher.clipboardLinkWithTagMatcher);
|
|
151
|
+
this.props.getQuillRef(quillDomRef);
|
|
152
|
+
editor.clipboard.addMatcher("a", import_clipboardLinkWithTagMatcher.clipboardLinkWithTagMatcher);
|
|
181
153
|
});
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
|
|
154
|
+
}
|
|
185
155
|
getEditor() {
|
|
186
156
|
return this.quill.getEditor();
|
|
187
157
|
}
|
|
188
|
-
|
|
189
158
|
render() {
|
|
159
|
+
const { isFieldModalOpen, isImageModalOpen } = this.state;
|
|
190
160
|
const {
|
|
191
|
-
isFieldModalOpen,
|
|
192
|
-
isImageModalOpen
|
|
193
|
-
} = this.state;
|
|
194
|
-
|
|
195
|
-
const _this$props = this.props,
|
|
196
|
-
{
|
|
197
161
|
containerProps = {},
|
|
198
162
|
customFields,
|
|
199
163
|
imagesData,
|
|
@@ -205,52 +169,50 @@ class DSWYSIWYGEditorImpl extends React__default["default"].PureComponent {
|
|
|
205
169
|
showRawHTML,
|
|
206
170
|
onShowHTML,
|
|
207
171
|
onChange,
|
|
208
|
-
hideItems
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
className:
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
})]
|
|
172
|
+
hideItems,
|
|
173
|
+
...editorProps
|
|
174
|
+
} = this.props;
|
|
175
|
+
return /* @__PURE__ */ import_react.default.createElement("div", {
|
|
176
|
+
...containerProps,
|
|
177
|
+
className: `quill-wysiwyg-editor ${showRawHTML ? "show-raw" : ""}`
|
|
178
|
+
}, customToolbar || /* @__PURE__ */ import_react.default.createElement(import_CustomToolbar.CustomToolbar, {
|
|
179
|
+
customFields,
|
|
180
|
+
onShowHTML,
|
|
181
|
+
hideItems,
|
|
182
|
+
userProps: this.props
|
|
183
|
+
}), /* @__PURE__ */ import_react.default.createElement(import_react_quill.default, {
|
|
184
|
+
ref: this.quillRef,
|
|
185
|
+
modules: this.quillModules,
|
|
186
|
+
onChange: this.onChangeQuill,
|
|
187
|
+
value,
|
|
188
|
+
style: {
|
|
189
|
+
height,
|
|
190
|
+
borderBottom: "1px solid #ccc"
|
|
191
|
+
},
|
|
192
|
+
...editorProps,
|
|
193
|
+
id: "wysiwyg-text-container"
|
|
194
|
+
}), /* @__PURE__ */ import_react.default.createElement("textarea", {
|
|
195
|
+
className: "raw-editor ql-container ql-snow ql-editor",
|
|
196
|
+
style: {
|
|
197
|
+
width: "100%",
|
|
198
|
+
resize: "none",
|
|
199
|
+
height,
|
|
200
|
+
minHeight: "200px"
|
|
201
|
+
},
|
|
202
|
+
onChange: this.onChangeTextArea,
|
|
203
|
+
value: (0, import_utils.formatHTML)(value)
|
|
204
|
+
}), imagesData && imagesData.length && /* @__PURE__ */ import_react.default.createElement(import_ImageLibraryModal.default, {
|
|
205
|
+
imagesData,
|
|
206
|
+
isOpen: isImageModalOpen,
|
|
207
|
+
onClose: this.onImageModalClose,
|
|
208
|
+
onConfirm: this.onImageConfirm
|
|
209
|
+
}), customFields && customFields.length && /* @__PURE__ */ import_react.default.createElement(import_InsertFieldModal.default, {
|
|
210
|
+
customFields,
|
|
211
|
+
isOpen: isFieldModalOpen,
|
|
212
|
+
onClose: this.onFieldModalClose,
|
|
213
|
+
onConfirm: this.onInserFieldConfirm
|
|
251
214
|
}));
|
|
252
215
|
}
|
|
253
|
-
|
|
254
216
|
}
|
|
255
|
-
|
|
256
|
-
|
|
217
|
+
module.exports = __toCommonJS(DSWYSIWYGEditorImpl_exports);
|
|
218
|
+
//# sourceMappingURL=DSWYSIWYGEditorImpl.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/DSWYSIWYGEditorImpl.tsx", "../../../../../scripts/build/transpile/react-shim.js"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable react/prop-types */\n/* eslint-disable max-lines */\nimport React from 'react';\nimport ReactQuill, { Quill } from 'react-quill';\nimport BlotFormatter from 'quill-blot-formatter';\n\nimport ImageLibraryModal from './ImageLibraryModal';\nimport InsertFieldModal from './InsertFieldModal';\nimport { CustomToolbar } from './CustomToolbar';\nimport IndentStyle from '../quillOverrides/IndentStyle';\nimport LinkFormat from '../quillOverrides/LinkFormat';\nimport { formatHTML } from '../utils';\nimport { clipboardLinkWithTagMatcher } from '../quillMatchers/clipboardLinkWithTagMatcher';\n\nQuill.register('modules/blotFormatter', BlotFormatter);\n\n// Fix block styled formats ----------------\nconst AlignStyle = Quill.import('attributors/style/align');\nconst FontStyle = Quill.import('attributors/style/font');\nFontStyle.whitelist = [\n // allow ONLY these fonts and the default\n 'serif',\n 'monospace',\n 'arial',\n 'comic-sans',\n 'courier-new',\n 'georgia',\n 'helvetica',\n 'lucida',\n];\nconst SizeStyle = Quill.import('attributors/style/size');\nSizeStyle.whitelist = [\n // allow ONLY these sizes and the default\n 'x-small',\n 'large',\n 'x-large',\n];\n\n// Fix Doc Viewer p tags extra margin issue ---------\nconst Block = Quill.import('blots/block');\nBlock.tagName = 'p';\nQuill.register(Block);\n\nQuill.register(AlignStyle, true);\nQuill.register(IndentStyle, true);\nQuill.register(FontStyle, true);\nQuill.register(SizeStyle, true);\n// -----------------------------------------\n\nexport default class DSWYSIWYGEditorImpl extends React.PureComponent {\n quillModules = {\n toolbar: {\n container: this.props.toolbarContainer ? `#${this.props.toolbarContainer}` : '#toolbar',\n handlers: {\n ...this.props.toolbarHandlers,\n },\n },\n clipboard: {\n // toggle to add extra line breaks when pasting HTML:\n matchVisual: false,\n },\n blotFormatter: {\n // options... https://github.com/Fandom-OSS/quill-blot-formatter\n },\n ...this.props.quillModules,\n };\n\n constructor(props) {\n super(props);\n Quill.register(LinkFormat, true);\n if (props.quillOverrides.length) {\n props.quillOverrides.map((override) => Quill.register(override, true));\n }\n this.state = {\n isImageModalOpen: false,\n isFieldModalOpen: false,\n };\n const { toolbar } = this.quillModules;\n if (props.imagesData) {\n toolbar.handlers.image = (value) => {\n const { imagesData, handleImageClick } = this.props;\n if (!imagesData.length) {\n return;\n }\n this.setState({ isImageModalOpen: !!value });\n handleImageClick(value);\n };\n }\n if (props.customFields) {\n toolbar.handlers.customFields = (value) => {\n const { customFields, handleCustomFieldClick } = this.props;\n if (!customFields.length) {\n return;\n }\n this.setState({ isFieldModalOpen: !!value });\n handleCustomFieldClick(value);\n };\n }\n }\n\n componentDidMount() {\n // this.quill doesn't exist untill the full call-stack execute\n // we need to \"setTimeout\" so this componentDidMount work as expected\n setTimeout(() => {\n const quillDomRef = this.quill;\n const editor = quillDomRef.getEditor();\n this.props.getQuillRef(quillDomRef);\n // https://github.com/quilljs/quill/issues/2677\n editor.clipboard.addMatcher('a', clipboardLinkWithTagMatcher);\n });\n }\n\n // eslint-disable-next-line max-params\n onChangeQuill = (html, delta, source, editor) => {\n const { showRawHTML, onChange } = this.props;\n if (!showRawHTML) onChange(html, delta, source, editor);\n };\n\n onChangeTextArea = (e) => {\n const { showRawHTML, onChange } = this.props;\n if (showRawHTML) onChange(e.target.value);\n };\n\n onInserFieldConfirm = (fieldCode) => {\n const editor = this.getEditor();\n const range = editor.getSelection(true);\n editor.insertText(range.index, fieldCode);\n };\n\n onImageConfirm = (image) => {\n if (!image) {\n return;\n }\n const editor = this.getEditor();\n const range = editor.getSelection(true);\n editor.insertEmbed(range.index, 'image', image.url);\n };\n\n onFieldModalClose = () => {\n this.setState({ isFieldModalOpen: false });\n };\n\n onImageModalClose = () => {\n this.setState({ isImageModalOpen: false });\n };\n\n getEditor() {\n return this.quill.getEditor();\n }\n\n quillRef = (ref) => {\n this.quill = ref;\n };\n\n render() {\n const { isFieldModalOpen, isImageModalOpen } = this.state;\n const {\n containerProps = {},\n customFields,\n imagesData,\n customToolbar,\n handleImageClick,\n handleCustomFieldClick,\n height,\n value,\n showRawHTML,\n onShowHTML,\n onChange,\n hideItems,\n ...editorProps\n } = this.props;\n\n return (\n <div\n // data-testid=\"wysiwyg-text-container\"\n {...containerProps}\n className={`quill-wysiwyg-editor ${showRawHTML ? 'show-raw' : ''}`}\n >\n {customToolbar || (\n <CustomToolbar\n customFields={customFields}\n onShowHTML={onShowHTML}\n hideItems={hideItems}\n userProps={this.props}\n />\n )}\n <ReactQuill\n ref={this.quillRef}\n modules={this.quillModules}\n onChange={this.onChangeQuill}\n value={value}\n style={{\n height,\n borderBottom: '1px solid #ccc',\n }}\n {...editorProps}\n id=\"wysiwyg-text-container\"\n />\n <textarea\n className=\"raw-editor ql-container ql-snow ql-editor\"\n style={{\n width: '100%',\n resize: 'none',\n height,\n minHeight: '200px',\n }}\n onChange={this.onChangeTextArea}\n value={formatHTML(value)}\n />\n {imagesData && imagesData.length && (\n <ImageLibraryModal\n imagesData={imagesData}\n isOpen={isImageModalOpen}\n onClose={this.onImageModalClose}\n onConfirm={this.onImageConfirm}\n />\n )}\n {customFields && customFields.length && (\n <InsertFieldModal\n customFields={customFields}\n isOpen={isFieldModalOpen}\n onClose={this.onFieldModalClose}\n onConfirm={this.onInserFieldConfirm}\n />\n )}\n </div>\n );\n }\n}\n", "import * as React from 'react';\nexport { React };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,72 +1,92 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __reExport = (target, module2, copyDefault, desc) => {
|
|
13
|
+
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(module2))
|
|
15
|
+
if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default"))
|
|
16
|
+
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return target;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (module2, isNodeMode) => {
|
|
21
|
+
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", !isNodeMode && module2 && module2.__esModule ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
|
|
22
|
+
};
|
|
23
|
+
var __toCommonJS = /* @__PURE__ */ ((cache) => {
|
|
24
|
+
return (module2, temp) => {
|
|
25
|
+
return cache && cache.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache && cache.set(module2, temp), temp);
|
|
26
|
+
};
|
|
27
|
+
})(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0);
|
|
28
|
+
var ImageLibraryModal_exports = {};
|
|
29
|
+
__export(ImageLibraryModal_exports, {
|
|
30
|
+
default: () => ImageLibraryModal
|
|
31
|
+
});
|
|
32
|
+
var React = __toESM(require("react"));
|
|
33
|
+
var import_react = __toESM(require("react"));
|
|
34
|
+
var import_ds_imagelibrarymodal = __toESM(require("@elliemae/ds-imagelibrarymodal"));
|
|
35
|
+
var import_prop_types = __toESM(require("prop-types"));
|
|
36
|
+
class ImageLibraryModal extends import_react.default.PureComponent {
|
|
23
37
|
constructor(props) {
|
|
24
38
|
super(props);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
this.setState({
|
|
28
|
-
selectedImage
|
|
29
|
-
});
|
|
39
|
+
this.onSelect = (selectedImage) => {
|
|
40
|
+
this.setState({ selectedImage });
|
|
30
41
|
};
|
|
31
|
-
|
|
32
42
|
this.onConfirm = () => {
|
|
33
|
-
const {
|
|
34
|
-
|
|
35
|
-
} = this.state;
|
|
36
|
-
const {
|
|
37
|
-
onConfirm,
|
|
38
|
-
onClose
|
|
39
|
-
} = this.props;
|
|
43
|
+
const { selectedImage } = this.state;
|
|
44
|
+
const { onConfirm, onClose } = this.props;
|
|
40
45
|
onConfirm(selectedImage);
|
|
41
46
|
onClose();
|
|
42
47
|
};
|
|
43
|
-
|
|
44
48
|
this.state = {
|
|
45
|
-
selectedImage:
|
|
49
|
+
selectedImage: void 0
|
|
46
50
|
};
|
|
47
51
|
}
|
|
48
|
-
|
|
49
52
|
render() {
|
|
50
|
-
return
|
|
53
|
+
return /* @__PURE__ */ import_react.default.createElement(import_ds_imagelibrarymodal.default, {
|
|
54
|
+
...this.props,
|
|
51
55
|
onConfirm: this.onConfirm,
|
|
52
56
|
onSelect: this.onSelect
|
|
53
|
-
})
|
|
57
|
+
});
|
|
54
58
|
}
|
|
55
|
-
|
|
56
59
|
}
|
|
60
|
+
ImageLibraryModal.propTypes = {
|
|
61
|
+
onConfirm: import_prop_types.default.func.isRequired,
|
|
62
|
+
onClose: import_prop_types.default.func.isRequired,
|
|
63
|
+
onReject: import_prop_types.default.func,
|
|
64
|
+
imagesData: import_prop_types.default.arrayOf(import_prop_types.default.shape({
|
|
65
|
+
id: import_prop_types.default.string,
|
|
66
|
+
url: import_prop_types.default.string.isRequired,
|
|
67
|
+
name: import_prop_types.default.string.isRequired,
|
|
68
|
+
description: import_prop_types.default.string,
|
|
69
|
+
createdBy: import_prop_types.default.string.isRequired,
|
|
70
|
+
createdDate: import_prop_types.default.string.isRequired
|
|
71
|
+
})),
|
|
72
|
+
isOpen: import_prop_types.default.bool.isRequired
|
|
73
|
+
};
|
|
57
74
|
ImageLibraryModal.defaultProps = {
|
|
58
|
-
onReject:
|
|
59
|
-
imagesData: [
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
75
|
+
onReject: void 0,
|
|
76
|
+
imagesData: [
|
|
77
|
+
{
|
|
78
|
+
url: "https://www.freeiconspng.com/minicovers/no-image-icon-6.png",
|
|
79
|
+
name: "no image",
|
|
80
|
+
createdBy: "user:John Doe",
|
|
81
|
+
createdDate: "0000-01-01 00:00 AM UTC"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
url: "https://asset-service-bucket-int.s3.us-west-2.amazonaws.com/bd527d8c-472f-4dff-b8c5-1c90d5bae01e",
|
|
85
|
+
name: "no image 2",
|
|
86
|
+
createdBy: "user:Jane Doe",
|
|
87
|
+
createdDate: "0000-01-01 00:00 AM UTC"
|
|
88
|
+
}
|
|
89
|
+
]
|
|
70
90
|
};
|
|
71
|
-
|
|
72
|
-
|
|
91
|
+
module.exports = __toCommonJS(ImageLibraryModal_exports);
|
|
92
|
+
//# sourceMappingURL=ImageLibraryModal.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/ImageLibraryModal.tsx", "../../../../../scripts/build/transpile/react-shim.js"],
|
|
4
|
+
"sourcesContent": ["import React from 'react';\nimport DSImageLibraryModal from '@elliemae/ds-imagelibrarymodal';\nimport PropTypes from 'prop-types';\n\nexport default class ImageLibraryModal extends React.PureComponent {\n static propTypes = {\n onConfirm: PropTypes.func.isRequired,\n onClose: PropTypes.func.isRequired,\n onReject: PropTypes.func,\n imagesData: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string,\n url: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n description: PropTypes.string,\n createdBy: PropTypes.string.isRequired,\n createdDate: PropTypes.string.isRequired,\n }),\n ),\n isOpen: PropTypes.bool.isRequired,\n };\n\n static defaultProps = {\n onReject: undefined,\n imagesData: [\n {\n url: 'https://www.freeiconspng.com/minicovers/no-image-icon-6.png',\n name: 'no image',\n createdBy: 'user:John Doe',\n createdDate: '0000-01-01 00:00 AM UTC',\n },\n {\n url:\n 'https://asset-service-bucket-int.s3.us-west-2.amazonaws.com/bd527d8c-472f-4dff-b8c5-1c90d5bae01e',\n name: 'no image 2',\n createdBy: 'user:Jane Doe',\n createdDate: '0000-01-01 00:00 AM UTC',\n },\n ],\n };\n\n constructor(props) {\n super(props);\n this.state = {\n selectedImage: undefined,\n };\n }\n\n onSelect = selectedImage => {\n this.setState({ selectedImage });\n };\n\n onConfirm = () => {\n const { selectedImage } = this.state;\n const { onConfirm, onClose } = this.props;\n onConfirm(selectedImage);\n onClose();\n };\n\n render() {\n return (\n <DSImageLibraryModal\n {...this.props}\n onConfirm={this.onConfirm}\n onSelect={this.onSelect}\n />\n );\n }\n}\n", "import * as React from 'react';\nexport { React };\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADAvB,mBAAkB;AAClB,kCAAgC;AAChC,wBAAsB;AAEtB,gCAA+C,qBAAM,cAAc;AAAA,EAqCjE,YAAY,OAAO;AACjB,UAAM;AAMR,oBAAW,mBAAiB;AAC1B,WAAK,SAAS,EAAE;AAAA;AAGlB,qBAAY,MAAM;AAChB,YAAM,EAAE,kBAAkB,KAAK;AAC/B,YAAM,EAAE,WAAW,YAAY,KAAK;AACpC,gBAAU;AACV;AAAA;AAbA,SAAK,QAAQ;AAAA,MACX,eAAe;AAAA;AAAA;AAAA,EAenB,SAAS;AACP,WACE,mDAAC,qCAAD;AAAA,SACM,KAAK;AAAA,MACT,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA;AAAA;AAAA;AA3Dd,AADT,kBACS,YAAY;AAAA,EACjB,WAAW,0BAAU,KAAK;AAAA,EAC1B,SAAS,0BAAU,KAAK;AAAA,EACxB,UAAU,0BAAU;AAAA,EACpB,YAAY,0BAAU,QACpB,0BAAU,MAAM;AAAA,IACd,IAAI,0BAAU;AAAA,IACd,KAAK,0BAAU,OAAO;AAAA,IACtB,MAAM,0BAAU,OAAO;AAAA,IACvB,aAAa,0BAAU;AAAA,IACvB,WAAW,0BAAU,OAAO;AAAA,IAC5B,aAAa,0BAAU,OAAO;AAAA;AAAA,EAGlC,QAAQ,0BAAU,KAAK;AAAA;AAGlB,AAlBT,kBAkBS,eAAe;AAAA,EACpB,UAAU;AAAA,EACV,YAAY;AAAA,IACV;AAAA,MACE,KAAK;AAAA,MACL,MAAM;AAAA,MACN,WAAW;AAAA,MACX,aAAa;AAAA;AAAA,IAEf;AAAA,MACE,KACE;AAAA,MACF,MAAM;AAAA,MACN,WAAW;AAAA,MACX,aAAa;AAAA;AAAA;AAAA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|