@cocreate/text 1.20.29 → 1.22.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/CHANGELOG.md +26 -0
- package/CoCreate.config.js +2 -2
- package/LICENSE +177 -178
- package/demo/custom-rich-text.html +15 -15
- package/demo/demos.1.html +4 -4
- package/demo/demos.html +11 -11
- package/demo/index.html +22 -22
- package/demo/test-webpage.html +17 -17
- package/docs/index.html +19 -19
- package/package.json +10 -11
- package/src/index.js +53 -50
- package/src/updateText.js +43 -43
- package/webpack.config.js +77 -73
- package/src/saveDomText.js +0 -32
package/src/index.js
CHANGED
@@ -1,17 +1,16 @@
|
|
1
1
|
/*global CustomEvent, navigator*/
|
2
2
|
import observer from '@cocreate/observer';
|
3
|
-
import crud from '@cocreate/crud-client';
|
4
3
|
import crdt from '@cocreate/crdt';
|
5
4
|
import cursors from '@cocreate/cursors';
|
6
5
|
import uuid from '@cocreate/uuid';
|
6
|
+
import { getAttributes, getAttributeNames, checkValue } from '@cocreate/utils';
|
7
7
|
import { updateDom } from './updateDom';
|
8
8
|
import { insertAdjacentElement, removeElement, setInnerText, setAttribute, removeAttribute, setClass, setStyle, replaceInnerText } from './updateText';
|
9
9
|
import { getSelection, processSelection } from '@cocreate/selection';
|
10
10
|
import action from '@cocreate/actions';
|
11
|
-
import './saveDomText';
|
12
11
|
|
13
12
|
let eventObj;
|
14
|
-
let selector = `[
|
13
|
+
let selector = `[array][object][key]`;
|
15
14
|
let selectors = `input${selector}, textarea${selector}, [contenteditable]${selector}:not([contenteditable='false'])`;
|
16
15
|
|
17
16
|
function init() {
|
@@ -27,20 +26,20 @@ function initElements(elements) {
|
|
27
26
|
}
|
28
27
|
|
29
28
|
function initElement(element) {
|
30
|
-
let {
|
31
|
-
if (!
|
29
|
+
let { array, object, key, isRealtime, isCrdt, isCrud, isSave, isRead } = getAttributes(element);
|
30
|
+
if (!array || !object || !key)
|
32
31
|
return
|
33
|
-
if (
|
34
|
-
element.
|
32
|
+
if (object == 'pending') {
|
33
|
+
element.pendingObject = true
|
35
34
|
return
|
36
35
|
}
|
37
|
-
if (['_id', 'organization_id', 'storage', 'database', '
|
36
|
+
if (['_id', 'organization_id', 'storage', 'database', 'array'].includes(key))
|
38
37
|
return
|
39
38
|
if (isCrdt == "false" || isRealtime == "false" || element.type == 'number')
|
40
39
|
return
|
41
|
-
if (!
|
40
|
+
if (!checkValue(array) || !checkValue(object) || !checkValue(key))
|
42
41
|
return
|
43
|
-
if (
|
42
|
+
if (key && key.startsWith("$"))
|
44
43
|
return
|
45
44
|
|
46
45
|
if (element.tagName === "INPUT" && ["text", "tel", "url"].includes(element.type) || element.tagName === "TEXTAREA" || element.hasAttribute('contenteditable')) {
|
@@ -59,9 +58,9 @@ function initElement(element) {
|
|
59
58
|
element.setAttribute('crdt', 'true');
|
60
59
|
element.crdt = { init: true };
|
61
60
|
|
62
|
-
// TODO:
|
63
|
-
let
|
64
|
-
if (element.
|
61
|
+
// TODO: newObject name consideration. its value is used for setting or overwriting existing value
|
62
|
+
let newObject = ''
|
63
|
+
if (element.pendingObject) {
|
65
64
|
|
66
65
|
let value;
|
67
66
|
if (element.hasAttribute('contenteditable'))
|
@@ -69,18 +68,18 @@ function initElement(element) {
|
|
69
68
|
else
|
70
69
|
value = element.value;
|
71
70
|
if (value)
|
72
|
-
|
71
|
+
newObject = value
|
73
72
|
|
74
|
-
delete element.
|
73
|
+
delete element.pendingObject
|
75
74
|
}
|
76
75
|
|
77
|
-
crdt.getText({
|
76
|
+
crdt.getText({ array, object, key, crud: isCrud, save: isSave, read: isRead, newObject }).then(response => {
|
78
77
|
if (response === undefined)
|
79
78
|
return;
|
80
79
|
if (!response) {
|
81
|
-
// if (element.
|
80
|
+
// if (element.pendingObject) {
|
82
81
|
// isRead = 'true'
|
83
|
-
// delete element.
|
82
|
+
// delete element.pendingObject
|
84
83
|
// }
|
85
84
|
|
86
85
|
let value;
|
@@ -91,7 +90,7 @@ function initElement(element) {
|
|
91
90
|
value = element.value;
|
92
91
|
}
|
93
92
|
if (value)
|
94
|
-
crdt.replaceText({
|
93
|
+
crdt.replaceText({ array, object, key, value, crud: isCrud, save: isSave, read: isRead });
|
95
94
|
}
|
96
95
|
else {
|
97
96
|
if (element.hasAttribute('contenteditable')) {
|
@@ -100,9 +99,13 @@ function initElement(element) {
|
|
100
99
|
else {
|
101
100
|
element.value = '';
|
102
101
|
}
|
103
|
-
updateElement({ element,
|
102
|
+
updateElement({ element, array, object, key, value: response, start: 0 })
|
104
103
|
}
|
105
104
|
});
|
105
|
+
|
106
|
+
element.getValue = async () => {
|
107
|
+
return await crdt.getText({ array, object, key })
|
108
|
+
}
|
106
109
|
}
|
107
110
|
}
|
108
111
|
|
@@ -157,11 +160,11 @@ function _mousedown(event) {
|
|
157
160
|
}
|
158
161
|
}
|
159
162
|
}
|
160
|
-
let contentEditable = target.closest('[
|
163
|
+
let contentEditable = target.closest('[array][object][key]');
|
161
164
|
if (contentEditable) {
|
162
165
|
target = contentEditable;
|
163
|
-
const {
|
164
|
-
if (
|
166
|
+
const { array, object, key } = getAttributes(target);
|
167
|
+
if (array && object && key && !target.hasAttribute('contenteditable'))
|
165
168
|
target.setAttribute('contenteditable', 'true');
|
166
169
|
}
|
167
170
|
// sendPosition(element)
|
@@ -169,10 +172,10 @@ function _mousedown(event) {
|
|
169
172
|
|
170
173
|
function _blur(event) {
|
171
174
|
let element = event.currentTarget;
|
172
|
-
const {
|
175
|
+
const { array, object, key } = getAttributes(element);
|
173
176
|
let start = null;
|
174
177
|
let end = null;
|
175
|
-
cursors.sendPosition({
|
178
|
+
cursors.sendPosition({ array, object, key, start, end });
|
176
179
|
}
|
177
180
|
|
178
181
|
function _cut(event) {
|
@@ -285,20 +288,20 @@ export function sendPosition(element) {
|
|
285
288
|
if (range.element) {
|
286
289
|
element = range.element;
|
287
290
|
}
|
288
|
-
if (element.tagName == 'HTML' && !element.hasAttribute('
|
291
|
+
if (element.tagName == 'HTML' && !element.hasAttribute('array') || !element.hasAttribute('array')) {
|
289
292
|
element = element.ownerDocument.defaultView.frameElement;
|
290
293
|
}
|
291
294
|
}
|
292
295
|
if (!element) return;
|
293
|
-
const {
|
294
|
-
if (isCrdt == 'false' || !
|
295
|
-
let currentPosition = {
|
296
|
+
const { array, object, key, isCrdt } = getAttributes(element);
|
297
|
+
if (isCrdt == 'false' || !array || !object || !key) return;
|
298
|
+
let currentPosition = { array, object, key, start, end };
|
296
299
|
if (JSON.stringify(currentPosition) === JSON.stringify(previousPosition))
|
297
300
|
return;
|
298
301
|
previousPosition = currentPosition;
|
299
302
|
element.activeElement = element;
|
300
303
|
window.activeElement = element;
|
301
|
-
cursors.sendPosition({
|
304
|
+
cursors.sendPosition({ array, object, key, start, end });
|
302
305
|
}
|
303
306
|
|
304
307
|
function updateText({ element, value, start, end, range, undoRedo }) {
|
@@ -306,20 +309,20 @@ function updateText({ element, value, start, end, range, undoRedo }) {
|
|
306
309
|
if (range.element)
|
307
310
|
element = range.element;
|
308
311
|
|
309
|
-
if (element.tagName == 'HTML' && !element.hasAttribute('
|
312
|
+
if (element.tagName == 'HTML' && !element.hasAttribute('array'))
|
310
313
|
element = element.ownerDocument.defaultView.frameElement;
|
311
314
|
}
|
312
|
-
const {
|
313
|
-
if (isCrdt == "false" || !
|
315
|
+
const { array, object, key, isCrud, isCrdt, isSave } = getAttributes(element);
|
316
|
+
if (isCrdt == "false" || !array || !object || !key) return;
|
314
317
|
|
315
318
|
if (undoRedo == 'undo')
|
316
|
-
return crdt.undoText({
|
319
|
+
return crdt.undoText({ array, object, key, isCrud, isCrdt, isSave })
|
317
320
|
if (undoRedo == 'redo')
|
318
|
-
return crdt.redoText({
|
321
|
+
return crdt.redoText({ array, object, key, isCrud, isCrdt, isSave })
|
319
322
|
|
320
323
|
let length = end - start;
|
321
324
|
if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") {
|
322
|
-
crdt.updateText({
|
325
|
+
crdt.updateText({ array, object, key, value, start, length, crud: isCrud, save: isSave });
|
323
326
|
} else {
|
324
327
|
let startEl = range.startContainer.parentElement;
|
325
328
|
let endEl = range.endContainer.parentElement;
|
@@ -328,7 +331,7 @@ function updateText({ element, value, start, end, range, undoRedo }) {
|
|
328
331
|
// // value = target.innerHTML;
|
329
332
|
// // replaceInnerText(domTextEditor, target, value)
|
330
333
|
}
|
331
|
-
crdt.updateText({
|
334
|
+
crdt.updateText({ array, object, value, key, start, length, crud: isCrud, save: isSave });
|
332
335
|
}
|
333
336
|
}
|
334
337
|
|
@@ -338,9 +341,9 @@ function _crdtUpdateListener() {
|
|
338
341
|
});
|
339
342
|
}
|
340
343
|
|
341
|
-
function updateElements({ elements,
|
344
|
+
function updateElements({ elements, array, object, key, value, start, length, string }) {
|
342
345
|
if (!elements) {
|
343
|
-
let selectors = `[
|
346
|
+
let selectors = `[array='${array}'][object='${object}'][key='${key}']`;
|
344
347
|
elements = document.querySelectorAll(`input${selectors}, textarea${selectors}, [contenteditable]${selectors}, [editor='dom']${selectors}`);
|
345
348
|
}
|
346
349
|
|
@@ -348,11 +351,11 @@ function updateElements({ elements, collection, document_id, name, value, start,
|
|
348
351
|
let isCrdt = element.getAttribute('crdt');
|
349
352
|
if (!element.hasAttribute('contenteditable') && isCrdt == 'false') return;
|
350
353
|
|
351
|
-
updateElement({ element,
|
354
|
+
updateElement({ element, array, object, key, value, start, length, string });
|
352
355
|
});
|
353
356
|
}
|
354
357
|
|
355
|
-
async function updateElement({ element,
|
358
|
+
async function updateElement({ element, array, object, key, value, start, length, string }) {
|
356
359
|
if (element.tagName == 'IFRAME') {
|
357
360
|
let eid = element.getAttribute('eid')
|
358
361
|
element = element.contentDocument.documentElement;
|
@@ -373,7 +376,7 @@ async function updateElement({ element, collection, document_id, name, value, st
|
|
373
376
|
else {
|
374
377
|
let domTextEditor = element;
|
375
378
|
if (string == undefined)
|
376
|
-
string = await crdt.getText({
|
379
|
+
string = await crdt.getText({ array, object, key });
|
377
380
|
let html = string;
|
378
381
|
if (length) {
|
379
382
|
let end = start + length;
|
@@ -434,10 +437,10 @@ observer.init({
|
|
434
437
|
observer.init({
|
435
438
|
name: 'CoCreateTextAttribtes',
|
436
439
|
observe: ['attributes'],
|
437
|
-
attributeName: [...
|
440
|
+
attributeName: [...getAttributeNames(['array', 'object', 'key']), 'contenteditable'],
|
438
441
|
target: selectors,
|
439
442
|
callback(mutation) {
|
440
|
-
let _id = mutation.target.getAttribute('
|
443
|
+
let _id = mutation.target.getAttribute('object')
|
441
444
|
if (!_id) {
|
442
445
|
_removeEventListeners(mutation.target)
|
443
446
|
mutation.target.removeAttribute('crdt')
|
@@ -450,18 +453,18 @@ observer.init({
|
|
450
453
|
action.init({
|
451
454
|
name: "undo",
|
452
455
|
endEvent: "undo",
|
453
|
-
callback: (
|
454
|
-
const {
|
455
|
-
crdt.undoText({
|
456
|
+
callback: (data) => {
|
457
|
+
const { array, object, key, isCrud, isCrdt, isSave } = getAttributes(data.element);
|
458
|
+
crdt.undoText({ array, object, key, isCrud, isCrdt, isSave })
|
456
459
|
}
|
457
460
|
});
|
458
461
|
|
459
462
|
action.init({
|
460
463
|
name: "redo",
|
461
464
|
endEvent: "redo",
|
462
|
-
callback: (
|
463
|
-
const {
|
464
|
-
crdt.redoText({
|
465
|
+
callback: (data) => {
|
466
|
+
const { array, object, key, isCrud, isCrdt, isSave } = getAttributes(data.element);
|
467
|
+
crdt.redoText({ array, object, key, isCrud, isCrdt, isSave })
|
465
468
|
}
|
466
469
|
});
|
467
470
|
|
package/src/updateText.js
CHANGED
@@ -1,79 +1,79 @@
|
|
1
|
-
import crud from '@cocreate/crud-client';
|
2
1
|
import crdt from '@cocreate/crdt';
|
3
|
-
import {
|
2
|
+
import {getAttributes} from '@cocreate/elements';
|
3
|
+
import { getStringPosition } from '@cocreate/selection';
|
4
4
|
|
5
5
|
export function insertAdjacentElement({ domTextEditor, target, position, element, elementValue }) {
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
6
|
+
let remove;
|
7
|
+
if (element && !elementValue) {
|
8
|
+
remove = getStringPosition({ string: domTextEditor.htmlString, target: element });
|
9
|
+
if (!remove.start && !remove.end)
|
10
|
+
throw new Error('insertAdjacentElement: element not found');
|
11
|
+
elementValue = domTextEditor.htmlString.substring(remove.start, remove.end);
|
12
|
+
}
|
13
|
+
|
14
|
+
let { start } = getStringPosition({ string: domTextEditor.htmlString, target, position, value: elementValue });
|
15
|
+
if (remove)
|
16
|
+
_updateText({ domTextEditor, start: remove.start, end: remove.end });
|
17
|
+
if (remove && remove.start < start) {
|
18
|
+
let length = remove.end - remove.start;
|
19
|
+
_updateText({ domTextEditor, value: elementValue, start: start - length });
|
20
|
+
}
|
21
|
+
else
|
22
|
+
_updateText({ domTextEditor, value: elementValue, start });
|
23
23
|
}
|
24
24
|
|
25
25
|
export function removeElement({ domTextEditor, target }) {
|
26
|
-
|
26
|
+
updateDomText({ domTextEditor, target });
|
27
27
|
}
|
28
28
|
|
29
29
|
export function setInnerText({ domTextEditor, target, value, start, end }) {
|
30
|
-
|
30
|
+
updateDomText({ domTextEditor, target, value, pos: { start, end } });
|
31
31
|
}
|
32
32
|
|
33
33
|
export function setClass({ domTextEditor, target, value }) {
|
34
|
-
|
34
|
+
updateDomText({ domTextEditor, target, attribute: 'class', value });
|
35
35
|
}
|
36
36
|
export function removeClass({ domTextEditor, target, value }) {
|
37
|
-
|
37
|
+
updateDomText({ domTextEditor, target, attribute: 'class', value, remove: true });
|
38
38
|
}
|
39
39
|
|
40
40
|
export function setStyle({ domTextEditor, target, property, value }) {
|
41
|
-
|
41
|
+
updateDomText({ domTextEditor, target, attribute: 'style', property, value });
|
42
42
|
}
|
43
43
|
|
44
44
|
export function removeStyle({ domTextEditor, target, property }) {
|
45
|
-
|
45
|
+
updateDomText({ domTextEditor, target, attribute: 'style', property, remove: true });
|
46
46
|
}
|
47
47
|
|
48
48
|
export function setAttribute({ domTextEditor, target, name, value }) {
|
49
|
-
|
49
|
+
updateDomText({ domTextEditor, target, attribute: name, value });
|
50
50
|
}
|
51
51
|
|
52
52
|
export function removeAttribute({ domTextEditor, target, name }) {
|
53
|
-
|
53
|
+
updateDomText({ domTextEditor, target, attribute: name, remove: 'true' });
|
54
54
|
}
|
55
55
|
|
56
56
|
export function replaceInnerText({ domTextEditor, target, value }) {
|
57
|
-
|
57
|
+
updateDomText({ domTextEditor, target, value });
|
58
58
|
}
|
59
59
|
|
60
60
|
export function updateDomText({ domTextEditor, target, position, element, elementValue, attribute, value, property, pos, remove }) {
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
61
|
+
let { start, end, newValue } = getStringPosition({ string: domTextEditor.htmlString, target, attribute, property, value, remove });
|
62
|
+
if (pos) {
|
63
|
+
start += pos.start;
|
64
|
+
end += pos.end;
|
65
|
+
}
|
66
|
+
if (start != end)
|
67
|
+
_updateText({ domTextEditor, start, end });
|
68
|
+
if (attribute && remove != 'true' || attribute && value)
|
69
|
+
_updateText({ domTextEditor, value: ` ${attribute}="${newValue}"`, start });
|
70
|
+
else if (value)
|
71
|
+
_updateText({ domTextEditor, value, start });
|
72
72
|
}
|
73
73
|
|
74
|
-
function _updateText({ domTextEditor, value, start, end}) {
|
75
|
-
if (domTextEditor.tagName =='HTML')
|
74
|
+
function _updateText({ domTextEditor, value, start, end }) {
|
75
|
+
if (domTextEditor.tagName == 'HTML')
|
76
76
|
domTextEditor = domTextEditor.ownerDocument.defaultView.frameElement;
|
77
|
-
const {
|
78
|
-
|
77
|
+
const { array, object, key, isCrud } = getAttributes(domTextEditor);
|
78
|
+
crdt.updateText({ array, object, key, value, start, length: end - start, crud: isCrud });
|
79
79
|
}
|
package/webpack.config.js
CHANGED
@@ -1,84 +1,88 @@
|
|
1
1
|
const path = require("path")
|
2
2
|
const TerserPlugin = require("terser-webpack-plugin")
|
3
3
|
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
|
4
|
-
let isProduction = process.env.NODE_ENV === "production"
|
5
4
|
const { CleanWebpackPlugin } = require("clean-webpack-plugin")
|
6
5
|
|
7
|
-
module.exports = {
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
output: {
|
12
|
-
path: path.resolve(__dirname, "dist"),
|
13
|
-
filename: isProduction ? "[name].min.js" : "[name].js",
|
14
|
-
libraryTarget: "umd",
|
15
|
-
libraryExport: "default",
|
16
|
-
library: ["CoCreate", "text"],
|
17
|
-
globalObject: "this",
|
18
|
-
},
|
6
|
+
module.exports = (env, argv) => {
|
7
|
+
let isProduction = false
|
8
|
+
if (argv.mode === 'production')
|
9
|
+
isProduction = true
|
19
10
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
filename: "[name].css",
|
24
|
-
}),
|
25
|
-
],
|
26
|
-
// Default mode for Webpack is production.
|
27
|
-
// Depending on mode Webpack will apply different things
|
28
|
-
// on final bundle. For now we don't need production's JavaScript
|
29
|
-
// minifying and other thing so let's set mode to development
|
30
|
-
mode: isProduction ? "production" : "development",
|
31
|
-
module: {
|
32
|
-
rules: [
|
33
|
-
{
|
34
|
-
test: /.js$/,
|
35
|
-
exclude: /(node_modules)/,
|
36
|
-
use: {
|
37
|
-
loader: "babel-loader",
|
38
|
-
options: {
|
39
|
-
plugins: ["@babel/plugin-transform-modules-commonjs"],
|
40
|
-
},
|
11
|
+
const config = {
|
12
|
+
entry: {
|
13
|
+
"CoCreate-text": "./src/index.js",
|
41
14
|
},
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
15
|
+
output: {
|
16
|
+
path: path.resolve(__dirname, "dist"),
|
17
|
+
filename: isProduction ? "[name].min.js" : "[name].js",
|
18
|
+
libraryTarget: "umd",
|
19
|
+
libraryExport: "default",
|
20
|
+
library: ["CoCreate", "text"],
|
21
|
+
globalObject: "this",
|
22
|
+
},
|
23
|
+
|
24
|
+
plugins: [
|
25
|
+
new CleanWebpackPlugin(),
|
26
|
+
new MiniCssExtractPlugin({
|
27
|
+
filename: "[name].css",
|
28
|
+
}),
|
48
29
|
],
|
49
|
-
|
50
|
-
|
51
|
-
|
30
|
+
// Default mode for Webpack is production.
|
31
|
+
// Depending on mode Webpack will apply different things
|
32
|
+
// on final bundle. For now we don't need production's JavaScript
|
33
|
+
// minifying and other thing so let's set mode to development
|
34
|
+
mode: isProduction ? "production" : "development",
|
35
|
+
module: {
|
36
|
+
rules: [
|
37
|
+
{
|
38
|
+
test: /.js$/,
|
39
|
+
exclude: /(node_modules)/,
|
40
|
+
use: {
|
41
|
+
loader: "babel-loader",
|
42
|
+
options: {
|
43
|
+
plugins: ["@babel/plugin-transform-modules-commonjs"],
|
44
|
+
},
|
45
|
+
},
|
46
|
+
},
|
47
|
+
{
|
48
|
+
test: /.css$/i,
|
49
|
+
use: [
|
50
|
+
{ loader: "style-loader", options: { injectType: "linkTag" } },
|
51
|
+
"file-loader",
|
52
|
+
],
|
53
|
+
},
|
54
|
+
],
|
55
|
+
},
|
52
56
|
|
53
|
-
|
54
|
-
|
57
|
+
// add source map
|
58
|
+
...(isProduction ? {} : { devtool: "eval-source-map" }),
|
55
59
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
60
|
+
// optimization: {
|
61
|
+
// minimize: true,
|
62
|
+
// minimizer: [
|
63
|
+
// new TerserPlugin({
|
64
|
+
// extractComments: true,
|
65
|
+
// // cache: true,
|
66
|
+
// parallel: true,
|
67
|
+
// // sourceMap: true, // Must be set to true if using source-maps in production
|
68
|
+
// terserOptions: {
|
69
|
+
// // https://github.com/webpack-contrib/terser-webpack-plugin#terseroptions
|
70
|
+
// // extractComments: 'all',
|
71
|
+
// compress: {
|
72
|
+
// drop_console: true,
|
73
|
+
// },
|
74
|
+
// },
|
75
|
+
// }),
|
76
|
+
// ],
|
77
|
+
// splitChunks: {
|
78
|
+
// chunks: "all",
|
79
|
+
// minSize: 200,
|
80
|
+
// // maxSize: 99999,
|
81
|
+
// //minChunks: 1,
|
78
82
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
}
|
83
|
+
// cacheGroups: {
|
84
|
+
// defaultVendors: false,
|
85
|
+
// },
|
86
|
+
// },
|
87
|
+
// },
|
88
|
+
}
|
package/src/saveDomText.js
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
/*globals CustomEvent*/
|
2
|
-
import action from '@cocreate/actions';
|
3
|
-
import crud from '@cocreate/crud-client';
|
4
|
-
import crdt from '@cocreate/crdt';
|
5
|
-
|
6
|
-
function save(btn){
|
7
|
-
const { collection, document_id, name, namespace, room, broadcast, broadcastSender, isUpsert} = crud.getAttributes(btn);
|
8
|
-
crdt.getText({collection, document_id, name}).then(response => {
|
9
|
-
crud.updateDocument({
|
10
|
-
collection,
|
11
|
-
document: {
|
12
|
-
_id: document_id,
|
13
|
-
[name]: response
|
14
|
-
},
|
15
|
-
upsert: isUpsert,
|
16
|
-
namespace,
|
17
|
-
room,
|
18
|
-
broadcast,
|
19
|
-
broadcastSender
|
20
|
-
});
|
21
|
-
|
22
|
-
document.dispatchEvent(new CustomEvent('savedDomText'));
|
23
|
-
});
|
24
|
-
}
|
25
|
-
|
26
|
-
action.init({
|
27
|
-
name: "saveDomText",
|
28
|
-
endEvent: "savedDomText",
|
29
|
-
callback: (btn, data) => {
|
30
|
-
save(btn);
|
31
|
-
},
|
32
|
-
});
|