@mbs-dev/react-editor 1.12.0 → 1.13.1

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,33 +89,10 @@ 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) {
117
92
  var _this = this;
93
+ var _a;
118
94
  var fn = this.jodit;
95
+ var data = ((_a = e === null || e === void 0 ? void 0 : e.data) !== null && _a !== void 0 ? _a : e);
119
96
  var restoreToLastCaret = function () {
120
97
  var _a, _b;
121
98
  var saved = selectionRef === null || selectionRef === void 0 ? void 0 : selectionRef.current;
@@ -148,51 +125,61 @@ var uploaderConfig = function (apiUrl, imageUrl, selectionRef) { return ({
148
125
  selectionRef.current = null;
149
126
  }
150
127
  };
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);
128
+ if ((data === null || data === void 0 ? void 0 : data.files) && data.files.length) {
129
+ data.files.forEach(function (filename, idx) {
130
+ var _a;
131
+ var src = imageUrl ? "".concat(imageUrl, "/").concat(filename) : filename;
132
+ restoreToLastCaret();
133
+ if (isImageByExtension(filename, _this.imagesExtensions || ['jpg', 'png', 'jpeg', 'gif', 'webp'])) {
134
+ var tagName = 'img';
135
+ var elm = fn.createInside.element(tagName);
136
+ elm.setAttribute('src', src);
137
+ fn.s.insertImage(elm, null, fn.o.imageDefaultWidth);
138
+ refreshSavedRange();
190
139
  }
191
- catch (_c) {
140
+ else {
141
+ var tagName = 'a';
142
+ var elm = fn.createInside.element(tagName);
143
+ elm.setAttribute('href', src);
144
+ elm.setAttribute('target', '_blank');
145
+ elm.setAttribute('rel', 'noopener noreferrer');
146
+ elm.textContent =
147
+ ((data === null || data === void 0 ? void 0 : data.origineFileName) && data.origineFileName[idx]) ||
148
+ getDisplayNameFromPath(filename);
149
+ fn.s.insertNode(elm);
150
+ if ((_a = fn === null || fn === void 0 ? void 0 : fn.s) === null || _a === void 0 ? void 0 : _a.setCursorAfter) {
151
+ try {
152
+ fn.s.setCursorAfter(elm);
153
+ }
154
+ catch (_b) {
155
+ }
156
+ }
157
+ refreshSavedRange();
192
158
  }
193
- }
194
- refreshSavedRange();
195
- });
159
+ });
160
+ }
161
+ if (typeof (data === null || data === void 0 ? void 0 : data.error) !== 'undefined') {
162
+ return Number(data.error) === 0;
163
+ }
164
+ return !!(e === null || e === void 0 ? void 0 : e.success);
165
+ },
166
+ getMessage: function (e) {
167
+ var _a, _b;
168
+ var data = ((_a = e === null || e === void 0 ? void 0 : e.data) !== null && _a !== void 0 ? _a : e);
169
+ if (typeof (data === null || data === void 0 ? void 0 : data.msg) === 'string')
170
+ return data.msg;
171
+ return ((_b = e === null || e === void 0 ? void 0 : e.data) === null || _b === void 0 ? void 0 : _b.messages) && Array.isArray(e.data.messages)
172
+ ? e.data.messages.join('')
173
+ : '';
174
+ },
175
+ process: function (resp) {
176
+ var _a, _b, _c, _d;
177
+ return {
178
+ files: (_a = resp === null || resp === void 0 ? void 0 : resp.data) === null || _a === void 0 ? void 0 : _a.files,
179
+ origineFileName: (_b = resp === null || resp === void 0 ? void 0 : resp.data) === null || _b === void 0 ? void 0 : _b.origineFileName,
180
+ error: (_c = resp === null || resp === void 0 ? void 0 : resp.data) === null || _c === void 0 ? void 0 : _c.error,
181
+ msg: (_d = resp === null || resp === void 0 ? void 0 : resp.data) === null || _d === void 0 ? void 0 : _d.msg,
182
+ };
196
183
  },
197
184
  error: function (e) {
198
185
  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.12.0",
3
+ "version": "1.13.1",
4
4
  "description": "react editor",
5
5
  "main": "dist/index.js",
6
6
  "types": "types/index.d.ts",
package/src/Editor.tsx CHANGED
@@ -56,36 +56,14 @@ 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;
59
+ const fn = this.jodit;
78
60
 
79
- return {
80
- files,
81
- error: typeof error === 'number' ? String(error) : (error ?? ''),
82
- msg: typeof msg === 'string' ? msg : '',
61
+ const data = (e?.data ?? e) as {
62
+ files?: string[];
63
+ origineFileName?: string[];
64
+ error?: number;
65
+ msg?: string;
83
66
  };
84
- },
85
-
86
- // ✅ FIX: handle insertion here to avoid default handler inserting "undefined[object Object]"
87
- defaultHandlerSuccess(this: any, data: any): void {
88
- const fn = this.jodit;
89
67
 
90
68
  const restoreToLastCaret = () => {
91
69
  const saved = selectionRef?.current;
@@ -99,6 +77,7 @@ export const uploaderConfig = (apiUrl?: string, imageUrl?: string, selectionRef?
99
77
  }
100
78
  }
101
79
 
80
+ // fallback: jodit internal save/restore
102
81
  if (fn?.s?.focus) fn.s.focus();
103
82
  if (fn?.s?.restore) {
104
83
  try {
@@ -120,59 +99,69 @@ export const uploaderConfig = (apiUrl?: string, imageUrl?: string, selectionRef?
120
99
  }
121
100
  };
122
101
 
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);
161
-
162
- fn.s.insertNode(elm);
102
+ if (data?.files && data.files.length) {
103
+ data.files.forEach((filename: string, idx: number) => {
104
+ const src = imageUrl ? `${imageUrl}/${filename}` : filename;
105
+
106
+ // ✅ Restore caret BEFORE inserting anything (image or file)
107
+ restoreToLastCaret();
108
+
109
+ // ✅ If it's an image => insert <img>, otherwise insert <a href="...">
110
+ if (isImageByExtension(filename, this.imagesExtensions || ['jpg', 'png', 'jpeg', 'gif', 'webp'])) {
111
+ const tagName = 'img';
112
+ const elm = fn.createInside.element(tagName);
113
+ elm.setAttribute('src', src);
114
+ fn.s.insertImage(elm as HTMLImageElement, null, fn.o.imageDefaultWidth);
115
+ refreshSavedRange();
116
+ } else {
117
+ const tagName = 'a';
118
+ const elm = fn.createInside.element(tagName);
119
+ elm.setAttribute('href', src);
120
+ elm.setAttribute('target', '_blank');
121
+ elm.setAttribute('rel', 'noopener noreferrer');
122
+
123
+ // ✅ Display origineFileName for files (not images)
124
+ elm.textContent =
125
+ (data?.origineFileName && data.origineFileName[idx]) ||
126
+ getDisplayNameFromPath(filename);
127
+
128
+ fn.s.insertNode(elm);
129
+
130
+ if (fn?.s?.setCursorAfter) {
131
+ try {
132
+ fn.s.setCursorAfter(elm);
133
+ } catch {
134
+ // ignore
135
+ }
136
+ }
163
137
 
164
- if (fn?.s?.setCursorAfter) {
165
- try {
166
- fn.s.setCursorAfter(elm);
167
- } catch {
168
- // ignore
138
+ refreshSavedRange();
169
139
  }
170
- }
140
+ });
141
+ }
142
+
143
+ if (typeof data?.error !== 'undefined') {
144
+ return Number(data.error) === 0;
145
+ }
171
146
 
172
- refreshSavedRange();
173
- });
147
+ return !!e?.success;
174
148
  },
149
+ getMessage(e: any): string {
150
+ const data = (e?.data ?? e) as { msg?: string; messages?: unknown };
151
+ if (typeof data?.msg === 'string') return data.msg;
175
152
 
153
+ return e?.data?.messages && Array.isArray(e.data.messages)
154
+ ? e.data.messages.join('')
155
+ : '';
156
+ },
157
+ process(resp: any): any {
158
+ return {
159
+ files: resp?.data?.files,
160
+ origineFileName: resp?.data?.origineFileName,
161
+ error: resp?.data?.error,
162
+ msg: resp?.data?.msg,
163
+ };
164
+ },
176
165
  error(this: any, e: Error): void {
177
166
  this.j.e.fire('errorMessage', e.message, 'error', 4000);
178
167
  },
package/types/Editor.d.ts CHANGED
@@ -14,12 +14,7 @@ export declare const uploaderConfig: (apiUrl?: string, imageUrl?: string, select
14
14
  prepareData(formdata: FormData): FormData;
15
15
  isSuccess(this: any, e: any): boolean;
16
16
  getMessage(e: any): string;
17
- process(resp: any): {
18
- files: any[];
19
- error: string;
20
- msg: string;
21
- };
22
- defaultHandlerSuccess(this: any, data: any): void;
17
+ process(resp: any): any;
23
18
  error(this: any, e: Error): void;
24
19
  defaultHandlerError(this: any, e: any): void;
25
20
  };