@mbs-dev/react-editor 1.10.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 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 _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) {
92
117
  var _this = this;
93
- var _a;
94
118
  var fn = this.jodit;
95
119
  var restoreToLastCaret = function () {
96
120
  var _a, _b;
@@ -124,51 +148,51 @@ var uploaderConfig = function (apiUrl, imageUrl, selectionRef) { return ({
124
148
  selectionRef.current = null;
125
149
  }
126
150
  };
127
- if (((_a = e === null || e === void 0 ? void 0 : e.data) === null || _a === void 0 ? void 0 : _a.files) && e.data.files.length) {
128
- e.data.files.forEach(function (filename) {
129
- var _a;
130
- var src = imageUrl ? "".concat(imageUrl, "/").concat(filename) : filename;
131
- restoreToLastCaret();
132
- if (isImageByExtension(filename, _this.imagesExtensions || ['jpg', 'png', 'jpeg', 'gif', 'webp'])) {
133
- var tagName = 'img';
134
- var elm = fn.createInside.element(tagName);
135
- elm.setAttribute('src', src);
136
- fn.s.insertImage(elm, null, fn.o.imageDefaultWidth);
137
- refreshSavedRange();
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);
138
190
  }
139
- else {
140
- var tagName = 'a';
141
- var elm = fn.createInside.element(tagName);
142
- elm.setAttribute('href', src);
143
- elm.setAttribute('target', '_blank');
144
- elm.setAttribute('rel', 'noopener noreferrer');
145
- elm.textContent = getDisplayNameFromPath(filename);
146
- fn.s.insertNode(elm);
147
- if ((_a = fn === null || fn === void 0 ? void 0 : fn.s) === null || _a === void 0 ? void 0 : _a.setCursorAfter) {
148
- try {
149
- fn.s.setCursorAfter(elm);
150
- }
151
- catch (_b) {
152
- }
153
- }
154
- refreshSavedRange();
191
+ catch (_c) {
155
192
  }
156
- });
157
- }
158
- return !!(e === null || e === void 0 ? void 0 : e.success);
159
- },
160
- getMessage: function (e) {
161
- var _a;
162
- return ((_a = e === null || e === void 0 ? void 0 : e.data) === null || _a === void 0 ? void 0 : _a.messages) && Array.isArray(e.data.messages) ? e.data.messages.join('') : '';
163
- },
164
- process: function (resp) {
165
- var files = [];
166
- files.unshift(resp === null || resp === void 0 ? void 0 : resp.data);
167
- return {
168
- files: resp === null || resp === void 0 ? void 0 : resp.data,
169
- error: resp === null || resp === void 0 ? void 0 : resp.msg,
170
- msg: resp === null || resp === void 0 ? void 0 : resp.msg,
171
- };
193
+ }
194
+ refreshSavedRange();
195
+ });
172
196
  },
173
197
  error: function (e) {
174
198
  this.j.e.fire('errorMessage', e.message, 'error', 4000);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mbs-dev/react-editor",
3
- "version": "1.10.0",
3
+ "version": "1.12.0",
4
4
  "description": "react editor",
5
5
  "main": "dist/index.js",
6
6
  "types": "types/index.d.ts",
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,58 +120,59 @@ export const uploaderConfig = (apiUrl?: string, imageUrl?: string, selectionRef?
92
120
  }
93
121
  };
94
122
 
95
- if (e?.data?.files && e.data.files.length) {
96
- e.data.files.forEach((filename: string) => {
97
- const src = imageUrl ? `${imageUrl}/${filename}` : filename;
98
-
99
- // ✅ Restore caret BEFORE inserting anything (image or file)
100
- restoreToLastCaret();
101
-
102
- // ✅ If it's an image => insert <img>, otherwise insert <a href="...">
103
- if (isImageByExtension(filename, this.imagesExtensions || ['jpg', 'png', 'jpeg', 'gif', 'webp'])) {
104
- const tagName = 'img';
105
- const elm = fn.createInside.element(tagName);
106
- elm.setAttribute('src', src);
107
- fn.s.insertImage(elm as HTMLImageElement, null, fn.o.imageDefaultWidth);
108
- refreshSavedRange();
109
- } else {
110
- const tagName = 'a';
111
- const elm = fn.createInside.element(tagName);
112
- elm.setAttribute('href', src);
113
- elm.setAttribute('target', '_blank');
114
- elm.setAttribute('rel', 'noopener noreferrer');
115
- elm.textContent = getDisplayNameFromPath(filename);
116
-
117
- fn.s.insertNode(elm);
118
-
119
- if (fn?.s?.setCursorAfter) {
120
- try {
121
- fn.s.setCursorAfter(elm);
122
- } catch {
123
- // ignore
124
- }
125
- }
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
+ };
131
+ }
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
+ }
153
+
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);
126
161
 
127
- refreshSavedRange();
162
+ fn.s.insertNode(elm);
163
+
164
+ if (fn?.s?.setCursorAfter) {
165
+ try {
166
+ fn.s.setCursorAfter(elm);
167
+ } catch {
168
+ // ignore
128
169
  }
129
- });
130
- }
170
+ }
131
171
 
132
- return !!e?.success;
133
- },
134
- getMessage(e: any): string {
135
- return e?.data?.messages && Array.isArray(e.data.messages) ? e.data.messages.join('') : '';
172
+ refreshSavedRange();
173
+ });
136
174
  },
137
- process(resp: any): { files: any[]; error: string; msg: string } {
138
- const files: any[] = [];
139
- files.unshift(resp?.data);
140
175
 
141
- return {
142
- files: resp?.data,
143
- error: resp?.msg,
144
- msg: resp?.msg,
145
- };
146
- },
147
176
  error(this: any, e: Error): void {
148
177
  this.j.e.fire('errorMessage', e.message, 'error', 4000);
149
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
  };