Skip to content

Commit c769747

Browse files
committed
fix: store original data while rendering to have access to root fields eg. collection
1 parent fefaebf commit c769747

File tree

1 file changed

+91
-44
lines changed

1 file changed

+91
-44
lines changed

src/index.js

+91-44
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*globals CustomEvent*/
22
import action from '@cocreate/actions';
33
import { queryDocumentSelector } from '@cocreate/utils';
4+
// import { getValue } from '../../CoCreate-elements/src/getValue';
45
// import api from '@cocreate/api';
56

67
const CoCreateRender = {
@@ -9,6 +10,8 @@ const CoCreateRender = {
910
try {
1011
if(typeof json == 'undefined' || !path)
1112
return false;
13+
if (path.indexOf('.') == -1)
14+
json = this.dataOriginal
1215
let jsonData = json, subpath = path.split('.');
1316

1417
for (let i = 0; i < subpath.length; i++) {
@@ -56,18 +59,24 @@ const CoCreateRender = {
5659
let variables = inputValue.match(/{{([A-Za-z0-9_.,\[\]\- ]*)}}/g);
5760
if (variables) {
5861
variables.forEach((attr) => {
62+
if (attr.includes(`collection`))
63+
if( this.dataOriginal[renderKey] && this.dataOriginal[renderKey]['collection'] && attr.includes(`{{${renderKey}.`))
64+
data[renderKey]['collection'] = this.dataOriginal[renderKey]['collection']
65+
5966
let value = self.__getValue(data, attr);
6067
// if (value) {
6168
// if (value && typeof(value) !== "object") {
62-
if (value && !Array.isArray(value)) {
69+
// if (value && !Array.isArray(value)) {
70+
if (value) {
6371
// converts object to string
6472
// if (!Array.isArray(value) && typeof(value) == "object") {
6573
if (typeof(value) == "object") {
66-
let str = '';
67-
for (const [key, val] of Object.entries(value)) {
68-
str += `${key}: ${val}\n`;
69-
}
70-
value = str
74+
// let str = '';
75+
// for (const [key, val] of Object.entries(value)) {
76+
// str += `${key}: ${val}\n`;
77+
// }
78+
79+
value = this.generateString(value)
7180
}
7281
isPass = true;
7382
inputValue = inputValue.replace(attr, value);
@@ -83,6 +92,25 @@ const CoCreateRender = {
8392
}
8493
return resultValue;
8594
},
95+
96+
generateString: function(value, str = ''){
97+
// let str = '';
98+
// do {
99+
let flag = true;
100+
if (str)
101+
flag = false;
102+
for (const [key, val] of Object.entries(value)) {
103+
if (typeof(val) == "object") {
104+
str += `${key}: \n`;
105+
this.generateString(val, str)
106+
}
107+
else
108+
str += `${key}: ${val}\n`;
109+
}
110+
// } while()
111+
if (flag)
112+
return str
113+
},
86114

87115
render: function(template, data) {
88116
let type = template.getAttribute('render-array') || "data";
@@ -94,17 +122,7 @@ const CoCreateRender = {
94122

95123
const isRenderObject = template.hasAttribute('render-object');
96124
if (isRenderObject){
97-
const renderObject = template.getAttribute('render-object');
98-
if (renderObject)
99-
arrayData = data[renderObject];
100-
101-
let array = []
102-
for (const [key, value] of Object.entries(arrayData)) {
103-
array.push({key: key, value: value})
104-
}
105-
if (array.length > 0)
106-
arrayData = array
107-
125+
const renderObject = template.getAttribute('render-object');
108126
type = renderObject || 'data'
109127
}
110128

@@ -115,29 +133,52 @@ const CoCreateRender = {
115133
arrayData = data[renderArray];
116134
type = renderArray || 'data';
117135
}
136+
if (isRenderObject && type) {
137+
let r_data = self.isRenderObject(arrayData[type], renderKey)
138+
for (let sdata of r_data) {
139+
let cloneEl = this.cloneEl(template);
140+
cloneEl.classList.add('clone_' + type);
141+
self.setValue([cloneEl], sdata, renderKey);
142+
template.insertAdjacentHTML('beforebegin', cloneEl.outerHTML);
143+
}
144+
} else {
118145

119-
if (!Array.isArray(arrayData))
120-
arrayData = this.__getValueFromObject(data, type);
121-
122-
if (!arrayData) {
123-
let cloneEl = this.cloneEl(template);
124-
cloneEl.classList.add('cloned');
125-
self.setValue([cloneEl], data, renderKey);
126-
template.insertAdjacentHTML('beforebegin', cloneEl.outerHTML);
127-
}
146+
if (!Array.isArray(arrayData))
147+
arrayData = this.__getValueFromObject(data, type);
128148

129-
if (type && Array.isArray(arrayData)) {
130-
arrayData.forEach((item) => {
149+
if (!arrayData) {
131150
let cloneEl = this.cloneEl(template);
132-
cloneEl.classList.add('clone_' + type);
133-
let r_data = self.__createObject(item, renderKey);
134-
135-
self.setValue([cloneEl], r_data, renderKey);
151+
cloneEl.classList.add('cloned');
152+
self.setValue([cloneEl], data, renderKey);
136153
template.insertAdjacentHTML('beforebegin', cloneEl.outerHTML);
137-
});
154+
}
155+
156+
if(type && Array.isArray(arrayData)) {
157+
arrayData.forEach((item) => {
158+
let cloneEl = this.cloneEl(template);
159+
cloneEl.classList.add('clone_' + type);
160+
let r_data = self.__createObject(item, renderKey);
161+
self.setValue([cloneEl], r_data, renderKey);
162+
template.insertAdjacentHTML('beforebegin', cloneEl.outerHTML);
163+
});
164+
}
138165
}
139166
},
140167

168+
isRenderObject: function(data, renderKey) {
169+
let array = []
170+
for (const [key, value] of Object.entries(data)) {
171+
let type = 'string';
172+
if (typeof(value) == "object")
173+
if (Array.isArray(value))
174+
type = 'array'
175+
else
176+
type = 'object'
177+
array.push({[renderKey]: {key, value, type}})
178+
}
179+
return array
180+
},
181+
141182
cloneEl: function(template) {
142183
let cloneEl = template.cloneNode(true);
143184
cloneEl.classList.remove('template');
@@ -146,14 +187,16 @@ const CoCreateRender = {
146187
cloneEl.setAttribute('templateId', templateId);
147188
return cloneEl;
148189
},
149-
150-
setValue:function(els, data, renderKey){
190+
191+
setValue: function(els, data, renderKey){
151192
if (!data) return;
152193
const that = this;
153194
Array.from(els).forEach(el => {
154195
if (el.nodeType == 1) {
155196
Array.from(el.attributes).forEach(attr=>{
156197
let attr_name = attr.name.toLowerCase();
198+
if (attr_name == 'collection')
199+
console.log('test')
157200
let attrValue = attr.value;
158201
attrValue = that.__replaceValue(data, attrValue, renderKey);
159202

@@ -162,17 +205,10 @@ const CoCreateRender = {
162205
}
163206
});
164207

165-
// if (el.classList.contains('template')) {
166-
// that.render(el, data);
167-
// }
168-
// if(el.childNodes.length > 0) {
169-
// that.setValue(el.childNodes, data, renderKey);
170-
// }
171-
172208
if(el.childNodes.length > 0) {
173209
that.setValue(el.childNodes, data, renderKey);
174210
}
175-
if (el.classList.contains('template')) {
211+
if (el.classList.contains('template') && !el.hasAttribute('template_id')) {
176212
that.render(el, data);
177213
}
178214
}
@@ -195,7 +231,9 @@ const CoCreateRender = {
195231
});
196232
},
197233

234+
dataOriginal: {},
198235
data: function({selector, data, elements}) {
236+
this.dataOriginal = data;
199237
if (selector) {
200238
let template = queryDocumentSelector(selector);
201239
if (!template) return;
@@ -205,7 +243,16 @@ const CoCreateRender = {
205243
else
206244
this.setValue([template], data);
207245
} else if (elements) {
208-
this.setValue(elements, data);
246+
if (elements.length == 1 && elements[0].classList.contains('template'))
247+
this.render(elements[0], data);
248+
else
249+
this.setValue(elements, data);
250+
// for (let element of elements) {
251+
// if (element.classList.contains('template'))
252+
// this.render(element, data);
253+
// else
254+
// this.setValue([element], data);
255+
// }
209256
}
210257

211258
}

0 commit comments

Comments
 (0)