@cocreate/text 1.15.11 → 1.15.14
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/CHANGELOG.md +21 -0
- package/package.json +1 -1
- package/src/index.js +41 -34
package/CHANGELOG.md
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
## [1.15.14](https://github.com/CoCreate-app/CoCreate-text/compare/v1.15.13...v1.15.14) (2022-04-30)
|
2
|
+
|
3
|
+
|
4
|
+
### Bug Fixes
|
5
|
+
|
6
|
+
* activeCursor element defined on window object ([88e4575](https://github.com/CoCreate-app/CoCreate-text/commit/88e457592fac304ffd02e56c491688d598838e6f))
|
7
|
+
|
8
|
+
## [1.15.13](https://github.com/CoCreate-app/CoCreate-text/compare/v1.15.12...v1.15.13) (2022-03-22)
|
9
|
+
|
10
|
+
|
11
|
+
### Bug Fixes
|
12
|
+
|
13
|
+
* removed emit from message.send and message.listen ([b672bb5](https://github.com/CoCreate-app/CoCreate-text/commit/b672bb57ee7005a0d1933bd014c079a6faa96cbd))
|
14
|
+
|
15
|
+
## [1.15.12](https://github.com/CoCreate-app/CoCreate-text/compare/v1.15.11...v1.15.12) (2022-03-21)
|
16
|
+
|
17
|
+
|
18
|
+
### Bug Fixes
|
19
|
+
|
20
|
+
* string formating differs between various OS \r\n and \r are replaced with \n ([87b0183](https://github.com/CoCreate-app/CoCreate-text/commit/87b018354240d6f25b57fb9fc272f52103c4072c))
|
21
|
+
|
1
22
|
## [1.15.11](https://github.com/CoCreate-app/CoCreate-text/compare/v1.15.10...v1.15.11) (2022-03-07)
|
2
23
|
|
3
24
|
|
package/package.json
CHANGED
package/src/index.js
CHANGED
@@ -27,11 +27,11 @@ function initElements (elements) {
|
|
27
27
|
|
28
28
|
function initElement (element) {
|
29
29
|
const { collection, document_id, name, isRealtime, isCrdt, isCrud, isSave, isRead } = crud.getAttr(element);
|
30
|
-
if(document_id == "pending") return;
|
31
|
-
if(isCrdt == "false" || isRealtime == "false" || element.type == 'number' || name == '_id') return;
|
32
|
-
if(!crud.checkAttrValue(collection) || !crud.checkAttrValue(document_id)) return;
|
33
|
-
if(element.tagName === "INPUT" && ["text", "email", "tel", "url"].includes(element.type) || element.tagName === "TEXTAREA" || element.hasAttribute('contenteditable')) {
|
34
|
-
if(!collection || !document_id || !name) return;
|
30
|
+
if (document_id == "pending") return;
|
31
|
+
if (isCrdt == "false" || isRealtime == "false" || element.type == 'number' || name == '_id') return;
|
32
|
+
if (!crud.checkAttrValue(collection) || !crud.checkAttrValue(document_id)) return;
|
33
|
+
if (element.tagName === "INPUT" && ["text", "email", "tel", "url"].includes(element.type) || element.tagName === "TEXTAREA" || element.hasAttribute('contenteditable')) {
|
34
|
+
if (!collection || !document_id || !name) return;
|
35
35
|
|
36
36
|
if (!isCrdt) {
|
37
37
|
if (element.tagName == 'IFRAME'){
|
@@ -47,7 +47,7 @@ function initElement (element) {
|
|
47
47
|
element.setAttribute('crdt', 'true');
|
48
48
|
element.crdt = {init: true};
|
49
49
|
crdt.getText({ collection, document_id, name, crud: isCrud, save: isSave, read: isRead }).then(response => {
|
50
|
-
if(response === undefined)
|
50
|
+
if (response === undefined)
|
51
51
|
return;
|
52
52
|
if (!response){
|
53
53
|
let value;
|
@@ -111,12 +111,15 @@ function _mousedown (event) {
|
|
111
111
|
let target = event.target;
|
112
112
|
// const path = event.path || (event.composedPath && event.composedPath());
|
113
113
|
// console.log(path)
|
114
|
-
if(!target.id){
|
115
|
-
|
116
|
-
if(
|
117
|
-
|
118
|
-
|
119
|
-
|
114
|
+
if (!target.id){
|
115
|
+
let isEid = domTextEditor.getAttribute('eid');
|
116
|
+
if (isEid != 'false' && isEid != null && isEid != undefined){
|
117
|
+
let eid = target.getAttribute('eid');
|
118
|
+
if (!eid){
|
119
|
+
eid = uuid.generate(6);
|
120
|
+
setAttribute({ domTextEditor, target, name: 'eid', value: eid });
|
121
|
+
}
|
122
|
+
}
|
120
123
|
}
|
121
124
|
let contentEditable = target.closest('[collection][document_id][name]');
|
122
125
|
if (contentEditable){
|
@@ -153,7 +156,7 @@ function _cut (event) {
|
|
153
156
|
/* clipboard write failed */
|
154
157
|
});
|
155
158
|
}
|
156
|
-
if(start != end) {
|
159
|
+
if (start != end) {
|
157
160
|
updateText({element, start, end, range});
|
158
161
|
}
|
159
162
|
event.preventDefault();
|
@@ -163,9 +166,9 @@ function _paste (event) {
|
|
163
166
|
let element = event.currentTarget;
|
164
167
|
if (element.getAttribute('crdt') == 'false')
|
165
168
|
return;
|
166
|
-
let value = event.clipboardData.getData('
|
169
|
+
let value = event.clipboardData.getData('text/plain').replace(/(\r\n|\r)/gm, "\n");;
|
167
170
|
const { start, end, range } = getSelection(element);
|
168
|
-
if(start != end) {
|
171
|
+
if (start != end) {
|
169
172
|
updateText({element, start, end, range});
|
170
173
|
}
|
171
174
|
updateText({element, value, start, range});
|
@@ -173,24 +176,24 @@ function _paste (event) {
|
|
173
176
|
}
|
174
177
|
|
175
178
|
function _keydown (event) {
|
176
|
-
if(event.stopCCText) return;
|
179
|
+
if (event.stopCCText) return;
|
177
180
|
let element = event.currentTarget;
|
178
181
|
if (element.getAttribute('crdt') == 'false')
|
179
182
|
return;
|
180
183
|
const { start, end, range } = getSelection(element);
|
181
|
-
if(event.key == "Backspace" || event.key == "Tab" || event.key == "Enter") {
|
184
|
+
if (event.key == "Backspace" || event.key == "Tab" || event.key == "Enter") {
|
182
185
|
eventObj = event;
|
183
|
-
if(start != end) {
|
186
|
+
if (start != end) {
|
184
187
|
updateText({element, start, end, range});
|
185
188
|
}
|
186
189
|
|
187
|
-
if(event.key == "Backspace" && start == end) {
|
190
|
+
if (event.key == "Backspace" && start == end) {
|
188
191
|
updateText({element, start: start - 1, end, range});
|
189
192
|
}
|
190
|
-
else if(event.key == 'Tab') {
|
193
|
+
else if (event.key == 'Tab') {
|
191
194
|
updateText({element, value: "\t", start, range});
|
192
195
|
}
|
193
|
-
else if(event.key == "Enter") {
|
196
|
+
else if (event.key == "Enter") {
|
194
197
|
updateText({element, value: "\n", start, range});
|
195
198
|
}
|
196
199
|
event.preventDefault();
|
@@ -204,13 +207,13 @@ function _keydown (event) {
|
|
204
207
|
}
|
205
208
|
|
206
209
|
function _beforeinput (event) {
|
207
|
-
if(event.stopCCText) return;
|
210
|
+
if (event.stopCCText) return;
|
208
211
|
let element = event.currentTarget;
|
209
212
|
if (element.getAttribute('crdt') == 'false')
|
210
213
|
return;
|
211
214
|
let { start, end, range } = getSelection(element);
|
212
215
|
if (event.data) {
|
213
|
-
if(start != end) {
|
216
|
+
if (start != end) {
|
214
217
|
updateText({element, start, end, range});
|
215
218
|
}
|
216
219
|
eventObj = event;
|
@@ -220,7 +223,7 @@ function _beforeinput (event) {
|
|
220
223
|
}
|
221
224
|
|
222
225
|
function _input (event) {
|
223
|
-
if(event.stopCCText) return;
|
226
|
+
if (event.stopCCText) return;
|
224
227
|
if (event.data) {
|
225
228
|
eventObj = event;
|
226
229
|
}
|
@@ -238,7 +241,7 @@ let previousPosition = {};
|
|
238
241
|
export function sendPosition (element) {
|
239
242
|
// if (!element) return;
|
240
243
|
const { start, end, range } = getSelection(element);
|
241
|
-
if(range) {
|
244
|
+
if (range) {
|
242
245
|
if (range.element){
|
243
246
|
element = range.element;
|
244
247
|
}
|
@@ -254,11 +257,12 @@ export function sendPosition (element) {
|
|
254
257
|
return;
|
255
258
|
previousPosition = currentPosition;
|
256
259
|
element.activeElement = element;
|
260
|
+
window.activeElement = element;
|
257
261
|
cursors.sendPosition({ collection, document_id, name, start, end });
|
258
262
|
}
|
259
263
|
|
260
264
|
function updateText ({element, value, start, end, range}) {
|
261
|
-
if(range) {
|
265
|
+
if (range) {
|
262
266
|
if (range.element)
|
263
267
|
element = range.element;
|
264
268
|
|
@@ -290,15 +294,15 @@ function _crdtUpdateListener () {
|
|
290
294
|
}
|
291
295
|
|
292
296
|
function updateElements({elements, collection, document_id, name, value, start, length, string}){
|
293
|
-
if(!elements){
|
297
|
+
if (!elements){
|
294
298
|
let selectors = `[collection='${collection}'][document_id='${document_id}'][name='${name}']`;
|
295
299
|
elements = document.querySelectorAll(`input${selectors}, textarea${selectors}, [contenteditable]${selectors}, [editor='dom']${selectors}`);
|
296
300
|
}
|
297
301
|
|
298
302
|
elements.forEach((element) => {
|
299
303
|
let isCrdt = element.getAttribute('crdt');
|
300
|
-
// if(isCrdt == 'false' && !element.hasAttribute('crdt') && !element.contentEditable) return;
|
301
|
-
// if(element.hasAttribute('contenteditable')){
|
304
|
+
// if (isCrdt == 'false' && !element.hasAttribute('crdt') && !element.contentEditable) return;
|
305
|
+
// if (element.hasAttribute('contenteditable')){
|
302
306
|
// let isEditable = element.getAttribute('contenteditable');
|
303
307
|
if (!element.hasAttribute('contenteditable') && isCrdt == 'false') return;
|
304
308
|
|
@@ -308,16 +312,19 @@ function updateElements({elements, collection, document_id, name, value, start,
|
|
308
312
|
|
309
313
|
async function updateElement ({element, collection, document_id, name, value, start, length, string }) {
|
310
314
|
if (element.tagName == 'IFRAME') {
|
315
|
+
let eid = element.getAttribute('eid')
|
311
316
|
element = element.contentDocument.documentElement;
|
317
|
+
if (eid != 'false' && eid != null && eid != undefined)
|
318
|
+
element.setAttribute('eid', eid)
|
312
319
|
if (element.contenteditable != 'false')
|
313
320
|
element.contentEditable = true;
|
314
321
|
}
|
315
|
-
if(value || length) {
|
322
|
+
if (value || length) {
|
316
323
|
if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") {
|
317
|
-
if(length) {
|
324
|
+
if (length) {
|
318
325
|
_updateElementText(element, "", start, start + length);
|
319
326
|
}
|
320
|
-
if(value) {
|
327
|
+
if (value) {
|
321
328
|
_updateElementText(element, value, start, start);
|
322
329
|
}
|
323
330
|
}
|
@@ -346,14 +353,14 @@ function _updateElementText (element, value, start, end) {
|
|
346
353
|
let activeElement = element.ownerDocument.activeElement;
|
347
354
|
element.setRangeText(value, start, end, "end");
|
348
355
|
let p = processSelection(element, value, prev_start, prev_end, start, end);
|
349
|
-
if(activeElement == element)
|
356
|
+
if (activeElement == element)
|
350
357
|
sendPosition(element);
|
351
358
|
_dispatchInputEvent(element, p.value, p.start, p.end, p.prev_start, p.prev_end);
|
352
359
|
}
|
353
360
|
|
354
361
|
export function _dispatchInputEvent(element, content, start, end, prev_start, prev_end) {
|
355
362
|
let detail = {value: content, start, end, prev_start, prev_end, skip: true};
|
356
|
-
if(eventObj) {
|
363
|
+
if (eventObj) {
|
357
364
|
let event = new CustomEvent(eventObj.type, { bubbles: true });
|
358
365
|
Object.defineProperty(event, 'stopCCText', { writable: false, value: true });
|
359
366
|
Object.defineProperty(event, 'target', { writable: false, value: element });
|