@mbs-dev/react-editor 1.11.0 → 1.12.0
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/dist/Editor.js +68 -71
- package/package.json +1 -1
- package/src/Editor.tsx +76 -80
- package/types/Editor.d.ts +1 -0
package/dist/Editor.js
CHANGED
|
@@ -89,8 +89,32 @@ var uploaderConfig = function (apiUrl, imageUrl, selectionRef) { return ({
|
|
|
89
89
|
return formdata;
|
|
90
90
|
},
|
|
91
91
|
isSuccess: function (e) {
|
|
92
|
-
var _this = this;
|
|
93
92
|
var _a, _b;
|
|
93
|
+
var err = (_a = (typeof (e === null || e === void 0 ? void 0 : e.error) === 'number' ? e.error : undefined)) !== null && _a !== void 0 ? _a : (typeof ((_b = e === null || e === void 0 ? void 0 : e.data) === null || _b === void 0 ? void 0 : _b.error) === 'number' ? e.data.error : undefined);
|
|
94
|
+
if ((e === null || e === void 0 ? void 0 : e.success) === true)
|
|
95
|
+
return true;
|
|
96
|
+
if (typeof err === 'number')
|
|
97
|
+
return err === 0;
|
|
98
|
+
return false;
|
|
99
|
+
},
|
|
100
|
+
getMessage: function (e) {
|
|
101
|
+
var _a, _b;
|
|
102
|
+
var msg = (_a = e === null || e === void 0 ? void 0 : e.msg) !== null && _a !== void 0 ? _a : (_b = e === null || e === void 0 ? void 0 : e.data) === null || _b === void 0 ? void 0 : _b.msg;
|
|
103
|
+
return typeof msg === 'string' ? msg : '';
|
|
104
|
+
},
|
|
105
|
+
process: function (resp) {
|
|
106
|
+
var payload = (resp === null || resp === void 0 ? void 0 : resp.data) ? resp.data : resp;
|
|
107
|
+
var files = Array.isArray(payload === null || payload === void 0 ? void 0 : payload.files) ? payload.files : [];
|
|
108
|
+
var error = payload === null || payload === void 0 ? void 0 : payload.error;
|
|
109
|
+
var msg = payload === null || payload === void 0 ? void 0 : payload.msg;
|
|
110
|
+
return {
|
|
111
|
+
files: files,
|
|
112
|
+
error: typeof error === 'number' ? String(error) : (error !== null && error !== void 0 ? error : ''),
|
|
113
|
+
msg: typeof msg === 'string' ? msg : '',
|
|
114
|
+
};
|
|
115
|
+
},
|
|
116
|
+
defaultHandlerSuccess: function (data) {
|
|
117
|
+
var _this = this;
|
|
94
118
|
var fn = this.jodit;
|
|
95
119
|
var restoreToLastCaret = function () {
|
|
96
120
|
var _a, _b;
|
|
@@ -124,78 +148,51 @@ var uploaderConfig = function (apiUrl, imageUrl, selectionRef) { return ({
|
|
|
124
148
|
selectionRef.current = null;
|
|
125
149
|
}
|
|
126
150
|
};
|
|
127
|
-
var
|
|
128
|
-
|
|
129
|
-
var
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
var
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
151
|
+
var list = (Array.isArray(data === null || data === void 0 ? void 0 : data.files) ? data.files : [])
|
|
152
|
+
.map(function (item) {
|
|
153
|
+
var _a;
|
|
154
|
+
if (typeof item === 'string')
|
|
155
|
+
return { file: item };
|
|
156
|
+
if (item && typeof item === 'object') {
|
|
157
|
+
return {
|
|
158
|
+
file: String((_a = item.file) !== null && _a !== void 0 ? _a : ''),
|
|
159
|
+
origineFileName: typeof item.origineFileName === 'string' ? item.origineFileName : undefined,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
return { file: '' };
|
|
163
|
+
})
|
|
164
|
+
.filter(function (x) { return !!x.file; });
|
|
165
|
+
if (!list.length)
|
|
166
|
+
return;
|
|
167
|
+
list.forEach(function (_a) {
|
|
168
|
+
var _b;
|
|
169
|
+
var file = _a.file, origineFileName = _a.origineFileName;
|
|
170
|
+
var src = imageUrl ? "".concat(imageUrl, "/").concat(file) : file;
|
|
171
|
+
restoreToLastCaret();
|
|
172
|
+
if (isImageByExtension(file, _this.imagesExtensions || ['jpg', 'png', 'jpeg', 'gif', 'webp'])) {
|
|
173
|
+
var tagName_1 = 'img';
|
|
174
|
+
var elm_1 = fn.createInside.element(tagName_1);
|
|
175
|
+
elm_1.setAttribute('src', src);
|
|
176
|
+
fn.s.insertImage(elm_1, null, fn.o.imageDefaultWidth);
|
|
177
|
+
refreshSavedRange();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
var tagName = 'a';
|
|
181
|
+
var elm = fn.createInside.element(tagName);
|
|
182
|
+
elm.setAttribute('href', src);
|
|
183
|
+
elm.setAttribute('target', '_blank');
|
|
184
|
+
elm.setAttribute('rel', 'noopener noreferrer');
|
|
185
|
+
elm.textContent = origineFileName || getDisplayNameFromPath(file);
|
|
186
|
+
fn.s.insertNode(elm);
|
|
187
|
+
if ((_b = fn === null || fn === void 0 ? void 0 : fn.s) === null || _b === void 0 ? void 0 : _b.setCursorAfter) {
|
|
188
|
+
try {
|
|
189
|
+
fn.s.setCursorAfter(elm);
|
|
157
190
|
}
|
|
158
|
-
|
|
159
|
-
var tagName = 'a';
|
|
160
|
-
var elm = fn.createInside.element(tagName);
|
|
161
|
-
elm.setAttribute('href', src);
|
|
162
|
-
elm.setAttribute('target', '_blank');
|
|
163
|
-
elm.setAttribute('rel', 'noopener noreferrer');
|
|
164
|
-
elm.textContent = origineFileName || getDisplayNameFromPath(file);
|
|
165
|
-
fn.s.insertNode(elm);
|
|
166
|
-
if ((_b = fn === null || fn === void 0 ? void 0 : fn.s) === null || _b === void 0 ? void 0 : _b.setCursorAfter) {
|
|
167
|
-
try {
|
|
168
|
-
fn.s.setCursorAfter(elm);
|
|
169
|
-
}
|
|
170
|
-
catch (_c) {
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
refreshSavedRange();
|
|
191
|
+
catch (_c) {
|
|
174
192
|
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
if ((e === null || e === void 0 ? void 0 : e.success) === true)
|
|
179
|
-
return true;
|
|
180
|
-
if (typeof err === 'number')
|
|
181
|
-
return err === 0;
|
|
182
|
-
return false;
|
|
183
|
-
},
|
|
184
|
-
getMessage: function (e) {
|
|
185
|
-
var _a, _b;
|
|
186
|
-
var msg = (_a = e === null || e === void 0 ? void 0 : e.msg) !== null && _a !== void 0 ? _a : (_b = e === null || e === void 0 ? void 0 : e.data) === null || _b === void 0 ? void 0 : _b.msg;
|
|
187
|
-
return typeof msg === 'string' ? msg : '';
|
|
188
|
-
},
|
|
189
|
-
process: function (resp) {
|
|
190
|
-
var payload = (resp === null || resp === void 0 ? void 0 : resp.data) ? resp.data : resp;
|
|
191
|
-
var files = Array.isArray(payload === null || payload === void 0 ? void 0 : payload.files) ? payload.files : [];
|
|
192
|
-
var error = payload === null || payload === void 0 ? void 0 : payload.error;
|
|
193
|
-
var msg = payload === null || payload === void 0 ? void 0 : payload.msg;
|
|
194
|
-
return {
|
|
195
|
-
files: files,
|
|
196
|
-
error: typeof error === 'number' ? String(error) : (error !== null && error !== void 0 ? error : ''),
|
|
197
|
-
msg: typeof msg === 'string' ? msg : '',
|
|
198
|
-
};
|
|
193
|
+
}
|
|
194
|
+
refreshSavedRange();
|
|
195
|
+
});
|
|
199
196
|
},
|
|
200
197
|
error: function (e) {
|
|
201
198
|
this.j.e.fire('errorMessage', e.message, 'error', 4000);
|
package/package.json
CHANGED
package/src/Editor.tsx
CHANGED
|
@@ -56,6 +56,35 @@ export const uploaderConfig = (apiUrl?: string, imageUrl?: string, selectionRef?
|
|
|
56
56
|
return formdata;
|
|
57
57
|
},
|
|
58
58
|
isSuccess(this: any, e: any): boolean {
|
|
59
|
+
const err =
|
|
60
|
+
(typeof e?.error === 'number' ? e.error : undefined) ??
|
|
61
|
+
(typeof e?.data?.error === 'number' ? e.data.error : undefined);
|
|
62
|
+
|
|
63
|
+
if (e?.success === true) return true;
|
|
64
|
+
if (typeof err === 'number') return err === 0;
|
|
65
|
+
|
|
66
|
+
return false;
|
|
67
|
+
},
|
|
68
|
+
getMessage(e: any): string {
|
|
69
|
+
const msg = e?.msg ?? e?.data?.msg;
|
|
70
|
+
return typeof msg === 'string' ? msg : '';
|
|
71
|
+
},
|
|
72
|
+
process(resp: any): { files: any[]; error: string; msg: string } {
|
|
73
|
+
const payload = resp?.data ? resp.data : resp;
|
|
74
|
+
|
|
75
|
+
const files = Array.isArray(payload?.files) ? payload.files : [];
|
|
76
|
+
const error = payload?.error;
|
|
77
|
+
const msg = payload?.msg;
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
files,
|
|
81
|
+
error: typeof error === 'number' ? String(error) : (error ?? ''),
|
|
82
|
+
msg: typeof msg === 'string' ? msg : '',
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
// ✅ FIX: handle insertion here to avoid default handler inserting "undefined[object Object]"
|
|
87
|
+
defaultHandlerSuccess(this: any, data: any): void {
|
|
59
88
|
const fn = this.jodit;
|
|
60
89
|
|
|
61
90
|
const restoreToLastCaret = () => {
|
|
@@ -70,7 +99,6 @@ export const uploaderConfig = (apiUrl?: string, imageUrl?: string, selectionRef?
|
|
|
70
99
|
}
|
|
71
100
|
}
|
|
72
101
|
|
|
73
|
-
// fallback: jodit internal save/restore
|
|
74
102
|
if (fn?.s?.focus) fn.s.focus();
|
|
75
103
|
if (fn?.s?.restore) {
|
|
76
104
|
try {
|
|
@@ -92,91 +120,59 @@ export const uploaderConfig = (apiUrl?: string, imageUrl?: string, selectionRef?
|
|
|
92
120
|
}
|
|
93
121
|
};
|
|
94
122
|
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
(
|
|
98
|
-
(
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if (typeof item === 'string') return { file: item };
|
|
104
|
-
if (item && typeof item === 'object') {
|
|
105
|
-
return {
|
|
106
|
-
file: String(item.file ?? ''),
|
|
107
|
-
origineFileName: item.origineFileName ? String(item.origineFileName) : undefined,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
return { file: '' };
|
|
111
|
-
})
|
|
112
|
-
.filter((x: { file: any; }) => !!x.file);
|
|
113
|
-
})();
|
|
114
|
-
|
|
115
|
-
if (normalizedFiles.length) {
|
|
116
|
-
normalizedFiles.forEach(({ file, origineFileName }) => {
|
|
117
|
-
const src = imageUrl ? `${imageUrl}/${file}` : file;
|
|
118
|
-
|
|
119
|
-
// ✅ Restore caret BEFORE inserting anything (image or file)
|
|
120
|
-
restoreToLastCaret();
|
|
121
|
-
|
|
122
|
-
// ✅ If it's an image => insert <img>, otherwise insert <a href="...">
|
|
123
|
-
if (isImageByExtension(file, this.imagesExtensions || ['jpg', 'png', 'jpeg', 'gif', 'webp'])) {
|
|
124
|
-
const tagName = 'img';
|
|
125
|
-
const elm = fn.createInside.element(tagName);
|
|
126
|
-
elm.setAttribute('src', src);
|
|
127
|
-
fn.s.insertImage(elm as HTMLImageElement, null, fn.o.imageDefaultWidth);
|
|
128
|
-
refreshSavedRange();
|
|
129
|
-
} else {
|
|
130
|
-
const tagName = 'a';
|
|
131
|
-
const elm = fn.createInside.element(tagName);
|
|
132
|
-
elm.setAttribute('href', src);
|
|
133
|
-
elm.setAttribute('target', '_blank');
|
|
134
|
-
elm.setAttribute('rel', 'noopener noreferrer');
|
|
135
|
-
|
|
136
|
-
// ✅ Display origineFileName (new response), fallback to previous logic
|
|
137
|
-
elm.textContent = origineFileName || getDisplayNameFromPath(file);
|
|
138
|
-
|
|
139
|
-
fn.s.insertNode(elm);
|
|
140
|
-
|
|
141
|
-
if (fn?.s?.setCursorAfter) {
|
|
142
|
-
try {
|
|
143
|
-
fn.s.setCursorAfter(elm);
|
|
144
|
-
} catch {
|
|
145
|
-
// ignore
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
refreshSavedRange();
|
|
123
|
+
const list: Array<{ file: string; origineFileName?: string }> = (Array.isArray(data?.files) ? data.files : [])
|
|
124
|
+
.map((item: any) => {
|
|
125
|
+
if (typeof item === 'string') return { file: item };
|
|
126
|
+
if (item && typeof item === 'object') {
|
|
127
|
+
return {
|
|
128
|
+
file: String(item.file ?? ''),
|
|
129
|
+
origineFileName: typeof item.origineFileName === 'string' ? item.origineFileName : undefined,
|
|
130
|
+
};
|
|
150
131
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
132
|
+
return { file: '' };
|
|
133
|
+
})
|
|
134
|
+
.filter((x: { file: any; }) => !!x.file);
|
|
135
|
+
|
|
136
|
+
if (!list.length) return;
|
|
137
|
+
|
|
138
|
+
list.forEach(({ file, origineFileName }) => {
|
|
139
|
+
const src = imageUrl ? `${imageUrl}/${file}` : file;
|
|
140
|
+
|
|
141
|
+
// ✅ Restore caret BEFORE inserting anything (image or file)
|
|
142
|
+
restoreToLastCaret();
|
|
143
|
+
|
|
144
|
+
// ✅ If it's an image => insert <img> (no filename display)
|
|
145
|
+
if (isImageByExtension(file, this.imagesExtensions || ['jpg', 'png', 'jpeg', 'gif', 'webp'])) {
|
|
146
|
+
const tagName = 'img';
|
|
147
|
+
const elm = fn.createInside.element(tagName);
|
|
148
|
+
elm.setAttribute('src', src);
|
|
149
|
+
fn.s.insertImage(elm as HTMLImageElement, null, fn.o.imageDefaultWidth);
|
|
150
|
+
refreshSavedRange();
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
157
153
|
|
|
158
|
-
|
|
159
|
-
|
|
154
|
+
// ✅ Otherwise insert <a> and display origineFileName (files only)
|
|
155
|
+
const tagName = 'a';
|
|
156
|
+
const elm = fn.createInside.element(tagName);
|
|
157
|
+
elm.setAttribute('href', src);
|
|
158
|
+
elm.setAttribute('target', '_blank');
|
|
159
|
+
elm.setAttribute('rel', 'noopener noreferrer');
|
|
160
|
+
elm.textContent = origineFileName || getDisplayNameFromPath(file);
|
|
160
161
|
|
|
161
|
-
|
|
162
|
-
},
|
|
163
|
-
getMessage(e: any): string {
|
|
164
|
-
const msg = e?.msg ?? e?.data?.msg;
|
|
165
|
-
return typeof msg === 'string' ? msg : '';
|
|
166
|
-
},
|
|
167
|
-
process(resp: any): { files: any[]; error: string; msg: string } {
|
|
168
|
-
const payload = resp?.data ? resp.data : resp;
|
|
162
|
+
fn.s.insertNode(elm);
|
|
169
163
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
164
|
+
if (fn?.s?.setCursorAfter) {
|
|
165
|
+
try {
|
|
166
|
+
fn.s.setCursorAfter(elm);
|
|
167
|
+
} catch {
|
|
168
|
+
// ignore
|
|
169
|
+
}
|
|
170
|
+
}
|
|
173
171
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
error: typeof error === 'number' ? String(error) : (error ?? ''),
|
|
177
|
-
msg: typeof msg === 'string' ? msg : '',
|
|
178
|
-
};
|
|
172
|
+
refreshSavedRange();
|
|
173
|
+
});
|
|
179
174
|
},
|
|
175
|
+
|
|
180
176
|
error(this: any, e: Error): void {
|
|
181
177
|
this.j.e.fire('errorMessage', e.message, 'error', 4000);
|
|
182
178
|
},
|
package/types/Editor.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ export declare const uploaderConfig: (apiUrl?: string, imageUrl?: string, select
|
|
|
19
19
|
error: string;
|
|
20
20
|
msg: string;
|
|
21
21
|
};
|
|
22
|
+
defaultHandlerSuccess(this: any, data: any): void;
|
|
22
23
|
error(this: any, e: Error): void;
|
|
23
24
|
defaultHandlerError(this: any, e: any): void;
|
|
24
25
|
};
|