@cocreate/render 1.24.32 → 1.26.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 +37 -0
- package/CoCreate.config.js +2 -2
- package/LICENSE +683 -21
- package/demo/fetch.string.html +5 -6
- package/demo/index.html +14 -16
- package/demo/render.array.html +17 -29
- package/demo/render.html +5 -5
- package/demo/render.object.html +7 -7
- package/docs/index.html +45 -48
- package/package.json +8 -8
- package/src/index.js +732 -519
- package/webpack.config.js +79 -73
package/src/index.js
CHANGED
|
@@ -1,531 +1,744 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (C) 2023 CoCreate and Contributors.
|
|
3
|
+
*
|
|
4
|
+
* This program is free software: you can redistribute it and/or modify
|
|
5
|
+
* it under the terms of the GNU Affero General Public License as published
|
|
6
|
+
* by the Free Software Foundation, either version 3 of the License, or
|
|
7
|
+
* (at your option) any later version.
|
|
8
|
+
*
|
|
9
|
+
* This program is distributed in the hope that it will be useful,
|
|
10
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
* GNU Affero General Public License for more details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU Affero General Public License
|
|
15
|
+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
16
|
+
********************************************************************************/
|
|
17
|
+
|
|
18
|
+
// Commercial Licensing Information:
|
|
19
|
+
// For commercial use of this software without the copyleft provisions of the AGPLv3,
|
|
20
|
+
// you must obtain a commercial license from CoCreate LLC.
|
|
21
|
+
// For details, visit <https://cocreate.app/licenses/> or contact us at sales@cocreate.app.
|
|
22
|
+
|
|
1
23
|
/*globals CustomEvent*/
|
|
2
|
-
import
|
|
3
|
-
import
|
|
24
|
+
import Actions from '@cocreate/actions';
|
|
25
|
+
import Observer from '@cocreate/observer';
|
|
4
26
|
import uuid from '@cocreate/uuid';
|
|
5
|
-
import {
|
|
27
|
+
import { queryElements, getValueFromObject, dotNotationToObject, ObjectId } from '@cocreate/utils';
|
|
6
28
|
import '@cocreate/element-prototype';
|
|
7
29
|
import './index.css';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
}
|
|
30
|
+
|
|
31
|
+
const sources = new Map()
|
|
32
|
+
const renderedNodes = new Map()
|
|
33
|
+
const elementSelector = '[render-selector], [render-closest], [render-parent], [render-next], [render-previous]'
|
|
34
|
+
|
|
35
|
+
function init(element) {
|
|
36
|
+
if (element && !(element instanceof HTMLCollection) && !Array.isArray(element))
|
|
37
|
+
element = [element]
|
|
38
|
+
else if (!element)
|
|
39
|
+
element = document.querySelectorAll(elementSelector)
|
|
40
|
+
|
|
41
|
+
for (let i = 0; i < element.length; i++) {
|
|
42
|
+
let source = sources.get(element[i])
|
|
43
|
+
if (!source) {
|
|
44
|
+
sources.set(element[i], { element: element[i] })
|
|
45
|
+
element[i].renderValue = (data) => render({ source: element[i], data })
|
|
46
|
+
element[i].getData = () => sources.get(element[i]).data
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function render({ source, element, data, key, index, currentIndex, update, remove }) {
|
|
52
|
+
if (!element) {
|
|
53
|
+
if (source) {
|
|
54
|
+
element = queryElements({ element: source, prefix: 'render' })
|
|
55
|
+
if (!element && source.children.length > 0) {
|
|
56
|
+
for (const child of source.children) {
|
|
57
|
+
if (child.matches('template, [template], .template, [render]')) {
|
|
58
|
+
element = child;
|
|
59
|
+
break; // Found the desired element, no need to continue the loop
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (!element) {
|
|
65
|
+
element = source.querySelector('template, [template], .template, [render]');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (!element) return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (source) {
|
|
73
|
+
let sourceData = sources.get(source)
|
|
74
|
+
if (!sourceData) {
|
|
75
|
+
sourceData = { element: source, data }
|
|
76
|
+
sources.set(source, sourceData)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
source = sourceData
|
|
80
|
+
if (!source.data)
|
|
81
|
+
source.data = data
|
|
82
|
+
} else if (data)
|
|
83
|
+
source = { data }
|
|
84
|
+
|
|
85
|
+
if (data.filter) {
|
|
86
|
+
index = index || data.filter.index
|
|
87
|
+
update = update || data.filter.update
|
|
88
|
+
remove = remove || data.filter.remove
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (!Array.isArray(element) && !(element instanceof HTMLCollection) && !(element instanceof NodeList))
|
|
92
|
+
element = [element]
|
|
93
|
+
|
|
94
|
+
for (let i = 0; i < element.length; i++) {
|
|
95
|
+
if (!key)
|
|
96
|
+
key = element[i].getAttribute('render')
|
|
97
|
+
|
|
98
|
+
let renderedNode = renderedNodes.get(element[i])
|
|
99
|
+
if (source) {
|
|
100
|
+
if (!renderedNode) {
|
|
101
|
+
renderedNode = { element: element[i], source, clones: new Map(), renderAs: new Map() }
|
|
102
|
+
renderedNodes.set(element[i], renderedNode)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (remove) {
|
|
107
|
+
if (renderedNode.source) {
|
|
108
|
+
if (key)
|
|
109
|
+
renderedNode.source.data[key].splice(index, 1)
|
|
110
|
+
else {
|
|
111
|
+
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
let clone = Array.from(renderedNode.clones)[index]
|
|
116
|
+
if (!clone) return
|
|
117
|
+
|
|
118
|
+
renderedNode.clones.delete(clone[0])
|
|
119
|
+
renderedNodes.delete(clone[1])
|
|
120
|
+
clone[1].remove()
|
|
121
|
+
} else if (key || Array.isArray(data)) {
|
|
122
|
+
if (update) {
|
|
123
|
+
let clone
|
|
124
|
+
|
|
125
|
+
if (!currentIndex)
|
|
126
|
+
currentIndex = data.filter.currentIndex
|
|
127
|
+
|
|
128
|
+
if (currentIndex >= 0)
|
|
129
|
+
clone = Array.from(renderedNode.clones)[currentIndex]
|
|
130
|
+
else
|
|
131
|
+
clone = Array.from(renderedNode.clones)[index]
|
|
132
|
+
|
|
133
|
+
if (!clone) return
|
|
134
|
+
|
|
135
|
+
await renderValues(clone[1], data);
|
|
136
|
+
if (currentIndex >= 0)
|
|
137
|
+
insertElement(renderedNode, clone[1], index, currentIndex)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// TODO: if $auto here every subsequent clone will have same value, not replacing here will apply unique value to each clone
|
|
141
|
+
if (key === '$auto')
|
|
142
|
+
key = key.replace(/\$auto/g, uuid.generate(6));
|
|
143
|
+
|
|
144
|
+
if (key)
|
|
145
|
+
element[i].setAttribute('render', key);
|
|
146
|
+
|
|
147
|
+
renderTemplate(element[i], data, key, index);
|
|
148
|
+
} else
|
|
149
|
+
await renderValues(element[i], data);
|
|
150
|
+
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async function renderTemplate(template, data, key, index, keyPath) {
|
|
156
|
+
if (!key)
|
|
157
|
+
key = template.getAttribute('render')
|
|
158
|
+
|
|
159
|
+
let templateData = renderedNodes.get(template)
|
|
160
|
+
if (!templateData) {
|
|
161
|
+
templateData = { element: template, clones: new Map() }
|
|
162
|
+
renderedNodes.set(template, templateData)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
templateData.parent = template.parentElement.closest('[render]')
|
|
166
|
+
if (templateData.parent)
|
|
167
|
+
templateData.parent = renderedNodes.get(templateData.parent)
|
|
168
|
+
|
|
169
|
+
if (!templateData.keyPath) {
|
|
170
|
+
if (keyPath)
|
|
171
|
+
templateData.keyPath = keyPath
|
|
172
|
+
else if (templateData.parent && templateData.parent.keyPath)
|
|
173
|
+
templateData.keyPath = templateData.parent.keyPath
|
|
174
|
+
else if (key)
|
|
175
|
+
templateData.keyPath = key
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
template = templateData
|
|
179
|
+
|
|
180
|
+
let renderData
|
|
181
|
+
if (key)
|
|
182
|
+
renderData = getRenderValue(template.element, data, key)
|
|
183
|
+
else if (Array.isArray(data))
|
|
184
|
+
renderData = data
|
|
185
|
+
|
|
186
|
+
if (!renderData) return
|
|
187
|
+
|
|
188
|
+
if (index === 0) {
|
|
189
|
+
for (const [key, element] of template.clones) {
|
|
190
|
+
renderedNodes.delete(element)
|
|
191
|
+
element.remove()
|
|
192
|
+
template.clones.delete(key)
|
|
193
|
+
}
|
|
194
|
+
// template.data = renderData
|
|
195
|
+
}
|
|
196
|
+
// else if (index) {
|
|
197
|
+
// updates data that has already been rendered
|
|
198
|
+
// template.data = dotNotationToObject(renderData, template.data)
|
|
199
|
+
// }
|
|
200
|
+
|
|
201
|
+
let renderAs = template.element.getAttribute('render-as') || key;
|
|
202
|
+
template.renderAs = renderAs
|
|
203
|
+
|
|
204
|
+
if (key && !Array.isArray(renderData)) {
|
|
205
|
+
let exclude = template.element.getAttribute('render-exclude') || ''
|
|
206
|
+
if (exclude) {
|
|
207
|
+
exclude = exclude.replace(/ /g, '').split(",")
|
|
208
|
+
if (!Array.isArray(exclude))
|
|
209
|
+
exclude = [exclude]
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const keys = Object.keys(renderData)
|
|
213
|
+
for (let i = 0; i < keys.length; i++) {
|
|
214
|
+
if (exclude.includes(keys[i]))
|
|
215
|
+
continue
|
|
216
|
+
|
|
217
|
+
let value = renderData[keys[i]]
|
|
218
|
+
let type = 'string';
|
|
219
|
+
|
|
220
|
+
if (Array.isArray(value))
|
|
221
|
+
type = 'array'
|
|
222
|
+
else if (typeof (value) == "object")
|
|
223
|
+
type = 'object'
|
|
224
|
+
|
|
225
|
+
let Data = { [renderAs]: { key: keys[i], value, type } }
|
|
226
|
+
|
|
227
|
+
let clone = cloneTemplate(template);
|
|
228
|
+
let renderedKey = key.split('.')
|
|
229
|
+
renderedKey = renderedKey[renderedKey.length - 1];
|
|
230
|
+
//renderedKey needs to remove the parent.renderAs/key
|
|
231
|
+
|
|
232
|
+
clone.key = keys[i]
|
|
233
|
+
clone.keyPath = template.keyPath + '.' + renderedKey
|
|
234
|
+
clone.parentKey = renderedKey
|
|
235
|
+
clone.renderKey = key
|
|
236
|
+
clone.element.setAttribute('renderedKey', keys[i])
|
|
237
|
+
await renderValues(clone.element, Data, keys[i], renderAs);
|
|
238
|
+
insertElement(template, clone.element, index);
|
|
239
|
+
|
|
240
|
+
}
|
|
241
|
+
} else {
|
|
242
|
+
if (!key && !Array.isArray(renderData)) {
|
|
243
|
+
key = 'data'
|
|
244
|
+
renderData = getValueFromObject(renderData, key);
|
|
245
|
+
if (!renderAs)
|
|
246
|
+
renderAs = key
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (!renderData) {
|
|
250
|
+
let clone = cloneTemplate(template);
|
|
251
|
+
clone.keyPath = template.keyPath
|
|
252
|
+
await renderValues(clone.element, data, key, renderAs);
|
|
253
|
+
insertElement(template, clone.element, index);
|
|
254
|
+
} else {
|
|
255
|
+
if (!Array.isArray(renderData))
|
|
256
|
+
renderData = [renderData]
|
|
257
|
+
|
|
258
|
+
for (let i = 0; i < renderData.length; i++) {
|
|
259
|
+
let clone = cloneTemplate(template);
|
|
260
|
+
clone.keyPath = template.keyPath || '' + `[${i}]`
|
|
261
|
+
|
|
262
|
+
let object
|
|
263
|
+
if (renderAs) {
|
|
264
|
+
object = { [renderAs]: renderData[i] }
|
|
265
|
+
if (renderAs.includes('.'))
|
|
266
|
+
object = dotNotationToObject(object);
|
|
267
|
+
} else
|
|
268
|
+
object = renderData[i]
|
|
269
|
+
|
|
270
|
+
await renderValues(clone.element, object, key, renderAs);
|
|
271
|
+
insertElement(template, clone.element, index);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function cloneTemplate(template) {
|
|
278
|
+
let clone = template.element.cloneNode(true);
|
|
279
|
+
|
|
280
|
+
if (clone.tagName == 'TEMPLATE') {
|
|
281
|
+
clone = template.element.content.firstElementChild
|
|
282
|
+
for (let attribute of template.element.attributes) {
|
|
283
|
+
clone.setAttribute(attribute.name, attribute.value || '');
|
|
284
|
+
}
|
|
285
|
+
} else {
|
|
286
|
+
clone.classList.remove('template');
|
|
287
|
+
clone.removeAttribute('template');
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
clone.setAttribute('render-clone', '');
|
|
291
|
+
|
|
292
|
+
let renderAs = clone.getAttribute('render-as')
|
|
293
|
+
if (renderAs) {
|
|
294
|
+
clone = clone.outerHTML.replace(/\$auto/g, renderAs);
|
|
295
|
+
} else {
|
|
296
|
+
clone = clone.outerHTML;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (typeof clone === 'string') {
|
|
300
|
+
let container = document.createElement('div');
|
|
301
|
+
container.innerHTML = clone;
|
|
302
|
+
clone = container.firstChild
|
|
303
|
+
container.remove()
|
|
304
|
+
}
|
|
305
|
+
let renderedNode = { template, element: clone }
|
|
306
|
+
renderedNodes.set(clone, renderedNode)
|
|
307
|
+
return renderedNode;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
function insertElement(template, element, index, currentIndex) {
|
|
311
|
+
let eid = element.getAttribute('eid')
|
|
312
|
+
if (!eid)
|
|
313
|
+
console.log('attribute eid not found')
|
|
314
|
+
|
|
315
|
+
if (index !== null && index >= 0) {
|
|
316
|
+
const clones = Array.from(template.clones);
|
|
317
|
+
|
|
318
|
+
let item
|
|
319
|
+
if (currentIndex) {
|
|
320
|
+
item = clones.splice(currentIndex, 1)[0];
|
|
321
|
+
} else {
|
|
322
|
+
item = [eid, element];
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
clones.splice(index, 0, item);
|
|
326
|
+
if (clones[index + 1] && clones[index][1] !== element)
|
|
327
|
+
clones[index][1].insertAdjacentElement('beforebegin', element);
|
|
328
|
+
else if (clones[index] && clones[index][1] !== element)
|
|
329
|
+
clones[index][1].insertAdjacentElement('afterend', element);
|
|
330
|
+
else
|
|
331
|
+
template.element.insertAdjacentElement('beforebegin', element);
|
|
332
|
+
template.clones = new Map(clones);
|
|
333
|
+
} else {
|
|
334
|
+
template.clones.set(eid, element)
|
|
335
|
+
template.element.insertAdjacentElement('beforebegin', element);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
async function renderValues(node, data, key, renderAs, keyPath, parent) {
|
|
340
|
+
if (!data) return;
|
|
341
|
+
|
|
342
|
+
let renderedNode = renderedNodes.get(node)
|
|
343
|
+
if (!renderedNode)
|
|
344
|
+
renderedNode = { key, renderAs }
|
|
345
|
+
|
|
346
|
+
if (!renderedNode.key)
|
|
347
|
+
renderedNode.key = key
|
|
348
|
+
else if (!key)
|
|
349
|
+
key = renderedNode.key
|
|
350
|
+
|
|
351
|
+
if (!renderedNode.renderAs)
|
|
352
|
+
renderedNode.renderAs = renderAs
|
|
353
|
+
else if (!renderAs)
|
|
354
|
+
renderAs = renderedNode.renderAs
|
|
355
|
+
|
|
356
|
+
if (keyPath)
|
|
357
|
+
renderedNode.keyPath = keyPath
|
|
358
|
+
else if (renderedNode.keyPath)
|
|
359
|
+
keyPath = renderedNode.keyPath
|
|
360
|
+
|
|
361
|
+
if (parent)
|
|
362
|
+
renderedNode.parent = parent
|
|
363
|
+
|
|
364
|
+
if (node.nodeType == 1) {
|
|
365
|
+
if (node.hasAttribute('render-clone')) {
|
|
366
|
+
parent = renderedNode
|
|
367
|
+
|
|
368
|
+
for (let eid of ['_id', 'name', 'key']) {
|
|
369
|
+
if (renderAs)
|
|
370
|
+
eid = data[renderAs][eid]
|
|
371
|
+
else
|
|
372
|
+
eid = data[eid]
|
|
373
|
+
|
|
374
|
+
if (!eid) continue
|
|
375
|
+
|
|
376
|
+
let oldEid = renderedNode.eid
|
|
377
|
+
let temp = renderedNode.template
|
|
378
|
+
if (!temp) {
|
|
379
|
+
console.log('temp could not be found')
|
|
380
|
+
} else if (!temp.clones) {
|
|
381
|
+
if (temp.template)
|
|
382
|
+
temp = temp.template
|
|
383
|
+
else
|
|
384
|
+
console.log(temp)
|
|
385
|
+
|
|
386
|
+
if (oldEid && oldEid !== eid)
|
|
387
|
+
temp.clones.delete(oldEid)
|
|
388
|
+
|
|
389
|
+
temp.clones.set(eid, node)
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
renderedNode.eid = eid
|
|
393
|
+
|
|
394
|
+
node.setAttribute('eid', eid)
|
|
395
|
+
break;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// Array.from(node.attributes).forEach(attr => {
|
|
400
|
+
for (let attr of node.attributes) {
|
|
401
|
+
let name = attr.name;
|
|
402
|
+
let value = attr.value;
|
|
403
|
+
|
|
404
|
+
let renderedAttribute = renderedNodes.get(attr)
|
|
405
|
+
if (!renderedAttribute) {
|
|
406
|
+
renderedAttribute = { placeholder: { name, value }, key, renderAs, parent: renderedNode }
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
let namePlaceholder = renderedAttribute.placeholder.name || name;
|
|
410
|
+
let valuePlaceholder = renderedAttribute.placeholder.value || value;
|
|
411
|
+
|
|
412
|
+
name = await renderValue(attr, data, namePlaceholder, renderAs, renderedAttribute);
|
|
413
|
+
value = await renderValue(attr, data, valuePlaceholder, renderAs, renderedAttribute);
|
|
414
|
+
|
|
415
|
+
if (name === undefined && name === null) {
|
|
416
|
+
renderedNodes.delete(attr)
|
|
417
|
+
node.removeAttribute(attr.name);
|
|
418
|
+
} else if ((value || value === "") && (name !== attr.name || value !== attr.value))
|
|
419
|
+
node.setAttribute(name, value);
|
|
420
|
+
}
|
|
421
|
+
// });
|
|
422
|
+
|
|
423
|
+
if (CoCreate.pass) {
|
|
424
|
+
if (node.hasAttribute('[pass_id]'))
|
|
425
|
+
CoCreate.pass.initElement(node)
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
if (node.tagName === 'SCRIPT' && node.src) {
|
|
429
|
+
if (node.src.includes('CoCreate.js') || node.src.includes('CoCreate.min.js')) {
|
|
430
|
+
node.remove()
|
|
431
|
+
return
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
if (node.tagName === 'LINK' && node.href) {
|
|
436
|
+
if (node.href.includes('CoCreate.css') || node.href.includes('CoCreate.min.css')) {
|
|
437
|
+
node.remove()
|
|
438
|
+
return
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
if (node.getAttribute('render') && !node.hasAttribute('render-clone')) {
|
|
442
|
+
renderTemplate(node, data);
|
|
443
|
+
} else if (node.childNodes.length > 0) {
|
|
444
|
+
// Array.from(node.childNodes).forEach(childNode => {
|
|
445
|
+
for (let childNode of node.childNodes) {
|
|
446
|
+
await renderValues(childNode, data, key, renderAs, keyPath, parent);
|
|
447
|
+
}
|
|
448
|
+
// });
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
} else if (node.nodeType == 3) {
|
|
453
|
+
let valueType = node.parentElement.getAttribute('value-type')
|
|
454
|
+
|
|
455
|
+
let textContent, text;
|
|
456
|
+
|
|
457
|
+
if (!renderedNode.placeholder && node.textContent.match(/{{(.*?)}}/))
|
|
458
|
+
renderedNode.placeholder = node.textContent
|
|
459
|
+
|
|
460
|
+
if (!renderedNode.placeholder)
|
|
461
|
+
return
|
|
462
|
+
textContent = renderedNode.placeholder || node.textContent;
|
|
463
|
+
|
|
464
|
+
text = await renderValue(node, data, textContent, renderAs, renderedNode);
|
|
465
|
+
|
|
466
|
+
if (text || text == "") {
|
|
467
|
+
if (text != renderedNode.text) {
|
|
468
|
+
renderedNode.text = text
|
|
469
|
+
|
|
470
|
+
if (valueType == 'text' || valueType == 'string' || valueType != "html") {
|
|
471
|
+
node.textContent = text;
|
|
472
|
+
} else {
|
|
473
|
+
const newNode = document.createElement('div');
|
|
474
|
+
newNode.innerHTML = text;
|
|
475
|
+
let parentElement = node.parentElement
|
|
476
|
+
|
|
477
|
+
let renderedParent = renderedNodes.get(parentElement)
|
|
478
|
+
if (!renderedParent) {
|
|
479
|
+
renderedParent = { placeholder: textContent, key, renderAs }
|
|
480
|
+
}
|
|
481
|
+
renderedParent.text = text
|
|
482
|
+
for (let newChild of newNode.childNodes) {
|
|
483
|
+
renderedNode.element = newChild
|
|
484
|
+
renderedNodes.set(newChild, renderedNode)
|
|
485
|
+
}
|
|
486
|
+
renderedNodes.delete(node)
|
|
487
|
+
node.replaceWith(...newNode.childNodes)
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
if (node.childNodes.length > 0) {
|
|
491
|
+
// Array.from(node.childNodes).forEach(childNode => {
|
|
492
|
+
for (let childNode of node.childNodes) {
|
|
493
|
+
await renderValues(childNode, data, key, renderAs, keyPath, parent);
|
|
494
|
+
}
|
|
495
|
+
// });
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
async function renderValue(node, data, placeholder, renderAs, renderedNode) {
|
|
503
|
+
let output = placeholder;
|
|
504
|
+
|
|
505
|
+
if (placeholder.match(/{{(.*?)}}/)) {
|
|
506
|
+
if (renderedNode) {
|
|
507
|
+
renderedNodes.set(node, renderedNode)
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
let match
|
|
511
|
+
do {
|
|
512
|
+
// match = output.match(/{{([A-Za-z0-9_.,\[\]\- ]*)}}/); // works by getting inner matches first
|
|
513
|
+
// match = output.match(/{{([^}]*)}}/);
|
|
514
|
+
match = output.match(/{{(.*?)}}/);
|
|
515
|
+
if (match) {
|
|
516
|
+
let value
|
|
517
|
+
try {
|
|
518
|
+
let Data = JSON.parse('{' + match[1].replace(/'/g, '"') + '}');
|
|
519
|
+
if (Data.storage || Data.database || Data.array || Data.object || Data.index) {
|
|
520
|
+
Data.method = 'read.object'
|
|
521
|
+
value = await CoCreate.crud.send(Data)
|
|
522
|
+
value = value.object[0][Data.key]
|
|
523
|
+
}
|
|
524
|
+
} catch (error) {
|
|
525
|
+
value = getRenderValue(node, data, match[1], renderAs)
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
if (value || value === "") {
|
|
529
|
+
if (typeof value === "object")
|
|
530
|
+
value = JSON.stringify(value, null, 2)
|
|
531
|
+
|
|
532
|
+
output = output.replace(match[0], value);
|
|
533
|
+
} else if (renderAs) {
|
|
534
|
+
if (match[0].startsWith(`{{${renderAs}.`)) {
|
|
535
|
+
output = output.replace(match[0], "");
|
|
536
|
+
} else {
|
|
537
|
+
match = null
|
|
538
|
+
}
|
|
539
|
+
} else {
|
|
540
|
+
match = null
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
} while (match)
|
|
546
|
+
}
|
|
547
|
+
return output;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
function getRenderValue(node, data, key, renderAs) {
|
|
551
|
+
let value = getValueFromObject(data, key);
|
|
552
|
+
|
|
553
|
+
if (!value && value !== '' && node) {
|
|
554
|
+
|
|
555
|
+
let parentTemplate = node
|
|
556
|
+
do {
|
|
557
|
+
let parentNode = renderedNodes.get(parentTemplate)
|
|
558
|
+
if (parentNode) {
|
|
559
|
+
|
|
560
|
+
if (!value && (parentNode.parent || parentNode.template)) {
|
|
561
|
+
let Data, eid, parent = parentNode.parent || parentNode.template
|
|
562
|
+
do {
|
|
563
|
+
if (key.includes('keyPath'))
|
|
564
|
+
value = parentNode.keyPath || parent.keyPath
|
|
565
|
+
else if (key.includes('parentKey')) {
|
|
566
|
+
value = parentNode.parentKey || parent.parentKey || parent.parent.parentKey
|
|
567
|
+
} else if (key.includes('renderAs')) {
|
|
568
|
+
value = renderAs
|
|
569
|
+
} else if (key === 'object' || key === '_id')
|
|
570
|
+
value = ObjectId()
|
|
571
|
+
else if (key === 'uuid')
|
|
572
|
+
value = uuid.generate(6)
|
|
573
|
+
else if (parent.source)
|
|
574
|
+
Data = parent.source.data
|
|
575
|
+
else if (parent.parent)
|
|
576
|
+
parent = parent.parent
|
|
577
|
+
else if (parent.template)
|
|
578
|
+
parent = parent.template
|
|
579
|
+
else
|
|
580
|
+
parent = undefined
|
|
581
|
+
|
|
582
|
+
if (!Data && parent && parent.eid)
|
|
583
|
+
eid = parent.eid
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
} while (!value && parent && !Data)
|
|
587
|
+
|
|
588
|
+
if (!value && Data)
|
|
589
|
+
value = getValueFromObject(Data, key);
|
|
590
|
+
|
|
591
|
+
if (!value && key.includes('.')) {
|
|
592
|
+
let renderedData = getValueFromObject(Data, key.split('.')[0]);
|
|
593
|
+
if (renderedData) {
|
|
594
|
+
let index
|
|
595
|
+
if (!parent.clones.size || parent.clones.size === 1)
|
|
596
|
+
index = 0
|
|
597
|
+
else if (eid)
|
|
598
|
+
index = Array.from(parent.clones.keys()).indexOf(eid);
|
|
599
|
+
else
|
|
600
|
+
console.log('eid not found')
|
|
601
|
+
|
|
602
|
+
if (index >= 0)
|
|
603
|
+
Data = { [key.split('.')[0]]: renderedData[index] }
|
|
604
|
+
|
|
605
|
+
value = getValueFromObject(Data, key);
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
if (!value && parentTemplate.parentElement)
|
|
613
|
+
parentTemplate = parentTemplate.parentElement.closest('[render]')
|
|
614
|
+
else
|
|
615
|
+
parentTemplate = undefined
|
|
616
|
+
|
|
617
|
+
} while (!value && parentTemplate)
|
|
618
|
+
}
|
|
619
|
+
return value
|
|
620
|
+
}
|
|
419
621
|
|
|
420
622
|
function renderKey(element, params) {
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
document.dispatchEvent(new CustomEvent('renderKey', {
|
|
447
|
-
detail: { data }
|
|
448
|
-
}));
|
|
623
|
+
// TODO: custom render-keys
|
|
624
|
+
const form = element.closest("form") || document;
|
|
625
|
+
if (!params)
|
|
626
|
+
params = 'render-key'
|
|
627
|
+
|
|
628
|
+
let data = {}
|
|
629
|
+
let selector = `[${params}]`
|
|
630
|
+
let elements = form.querySelectorAll(selector);
|
|
631
|
+
for (let el of elements) {
|
|
632
|
+
let attribute = el.getAttribute(params)
|
|
633
|
+
if (attribute)
|
|
634
|
+
data[attribute] = el.getValue()
|
|
635
|
+
}
|
|
636
|
+
data = dotNotationToObject(data)
|
|
637
|
+
let renderData = { data: { [params]: data } }
|
|
638
|
+
|
|
639
|
+
let renderSelector = element.getAttribute('render-selector')
|
|
640
|
+
if (!renderSelector) return
|
|
641
|
+
|
|
642
|
+
renderData.selector = renderSelector
|
|
643
|
+
render(renderData);
|
|
644
|
+
|
|
645
|
+
document.dispatchEvent(new CustomEvent('renderKey', {
|
|
646
|
+
detail: { data }
|
|
647
|
+
}));
|
|
449
648
|
}
|
|
450
649
|
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
650
|
+
Actions.init({
|
|
651
|
+
name: "renderKey",
|
|
652
|
+
callback: (action) => {
|
|
653
|
+
renderKey(action.element, action.params);
|
|
654
|
+
}
|
|
456
655
|
});
|
|
457
656
|
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
data = el.renderedData
|
|
477
|
-
if (data) {
|
|
478
|
-
renderedData.set(data, '')
|
|
479
|
-
}
|
|
480
|
-
let parentKey = el.getAttribute('parentKey')
|
|
481
|
-
if (parentKey && parentKey != null) {
|
|
482
|
-
if (/^\d+$/.test(parentKey))
|
|
483
|
-
parentKey = `[${parentKey}]`
|
|
484
|
-
parentKeys.push(parentKey)
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
} while (el)
|
|
488
|
-
|
|
489
|
-
let renderKey = element.getAttribute('render-key')
|
|
490
|
-
|
|
491
|
-
let parentKey;
|
|
492
|
-
parentKey = parentElement.getAttribute('parentKey')
|
|
493
|
-
if (renderKey == '$auto' || parentKey || parentKeys) {
|
|
494
|
-
let template = element.outerHTML
|
|
495
|
-
if (renderKey) {
|
|
496
|
-
template = template.replace(/\$auto/g, uuid.generate(6));
|
|
497
|
-
}
|
|
498
|
-
if (parentKeys.length > 0) {
|
|
499
|
-
let string = ''
|
|
500
|
-
if (parentKeys.length == 1){
|
|
501
|
-
string = parentKeys[0]
|
|
502
|
-
}
|
|
503
|
-
else
|
|
504
|
-
string = parentKeys.reverse().join('.')
|
|
505
|
-
string = string.replace(/.\[/g, '[');
|
|
506
|
-
template = template.replace(/\$parents/g, string);
|
|
507
|
-
}
|
|
508
|
-
if (parentKey) {
|
|
509
|
-
template = template.replace(/\$parent/g, parentKey);
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
parentElement.innerHTML = template
|
|
513
|
-
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
element = parentElement.firstElementChild
|
|
517
|
-
let obj = {}
|
|
518
|
-
let array = Array.from(renderedData.keys())
|
|
519
|
-
for (let data of array.reverse()){
|
|
520
|
-
obj = {...obj, ...data}
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
CoCreateRender.data({
|
|
524
|
-
elements: [element],
|
|
525
|
-
data: obj
|
|
526
|
-
});
|
|
527
|
-
}
|
|
528
|
-
}
|
|
657
|
+
Observer.init({
|
|
658
|
+
name: 'render',
|
|
659
|
+
observe: ['addedNodes'],
|
|
660
|
+
target: elementSelector,
|
|
661
|
+
callback: function (mutation) {
|
|
662
|
+
init(mutation.target)
|
|
663
|
+
}
|
|
664
|
+
})
|
|
665
|
+
|
|
666
|
+
Observer.init({
|
|
667
|
+
name: 'fileRender',
|
|
668
|
+
observe: ['attributes'],
|
|
669
|
+
attributeName: ['render-selector', 'render-closest', 'render-parent', 'render-next', 'render-previous'],
|
|
670
|
+
callback: function (mutation) {
|
|
671
|
+
render({
|
|
672
|
+
element: mutation.target, data: mutation.target.getValue()
|
|
673
|
+
});
|
|
674
|
+
}
|
|
529
675
|
});
|
|
530
676
|
|
|
531
|
-
|
|
677
|
+
|
|
678
|
+
Observer.init({
|
|
679
|
+
name: 'render',
|
|
680
|
+
observe: ['addedNodes'],
|
|
681
|
+
target: '[render]',
|
|
682
|
+
callback: function (mutation) {
|
|
683
|
+
if (mutation.target.hasAttribute('render-clone'))
|
|
684
|
+
return
|
|
685
|
+
let parentElement = mutation.target.parentElement.closest(['render'])
|
|
686
|
+
if (!parentElement) return
|
|
687
|
+
|
|
688
|
+
let renderedNode = renderedNodes.get(parentElement)
|
|
689
|
+
let data = renderedNode.source.data
|
|
690
|
+
|
|
691
|
+
render({ element: mutation.target, data });
|
|
692
|
+
|
|
693
|
+
}
|
|
694
|
+
});
|
|
695
|
+
|
|
696
|
+
// Observer.init({
|
|
697
|
+
// name: 'render',
|
|
698
|
+
// observe: ['addedNodes'],
|
|
699
|
+
// target: '[render-clone]',
|
|
700
|
+
// callback: function (mutation) {
|
|
701
|
+
// let renderedNode = renderedNodes.get(mutation.target)
|
|
702
|
+
// if (!renderedNode) return
|
|
703
|
+
|
|
704
|
+
// render({ source, element, data, key, index, currentIndex, update, remove })
|
|
705
|
+
|
|
706
|
+
// let nextElement = mutation.target.nextElementSibling
|
|
707
|
+
// if (!nextElement) return
|
|
708
|
+
|
|
709
|
+
// let nextRenderedNode = renderedNodes.get(nextElement)
|
|
710
|
+
// if (!nextRenderedNode) return
|
|
711
|
+
|
|
712
|
+
// let clones
|
|
713
|
+
// if (nextRenderedNode.template)
|
|
714
|
+
// clones = nextRenderedNode.template.clones
|
|
715
|
+
// else if (nextRenderedNode.clones)
|
|
716
|
+
// clones = nextRenderedNode.clones
|
|
717
|
+
|
|
718
|
+
// const cloneValueArray = Array.from(clones.values())
|
|
719
|
+
// let index = cloneValueArray.indexOf(nextElement);
|
|
720
|
+
|
|
721
|
+
// const cloneArray = Array.from(clones)
|
|
722
|
+
|
|
723
|
+
// cloneArray.splice(index, 0, [renderedNode.eid, mutation.target]);
|
|
724
|
+
// clones = new Map(cloneArray);
|
|
725
|
+
|
|
726
|
+
// }
|
|
727
|
+
// })
|
|
728
|
+
|
|
729
|
+
Observer.init({
|
|
730
|
+
name: 'renderNodesRemoved',
|
|
731
|
+
observe: ['removedNodes'],
|
|
732
|
+
target: '[render-clone]',
|
|
733
|
+
callback: function (mutation) {
|
|
734
|
+
if (mutation.target.parentElement) return
|
|
735
|
+
let renderedNode = renderedNodes.get(mutation.target)
|
|
736
|
+
if (!renderedNode) return
|
|
737
|
+
renderedNode.template.clones.delete(renderedNode.eid)
|
|
738
|
+
renderedNodes.delete(mutation.target)
|
|
739
|
+
}
|
|
740
|
+
})
|
|
741
|
+
|
|
742
|
+
init()
|
|
743
|
+
|
|
744
|
+
export default { render, sources, renderedNodes }
|