@@ -95,57 +95,65 @@ async function render({
9595update,
9696remove
9797} ) {
98- let Data = { ...data } ;
98+ if ( ! data || ( ! source && ! data ) ) {
99+ return ;
100+ }
101+
99102if ( ! element ) {
100- if ( source ) {
101- if ( source . hasAttribute ( "render-query" ) ) {
102- element = queryElements ( { element : source , prefix : "render" } ) ;
103+ if ( source instanceof HTMLElement ) {
104+ if ( selector || ( selector = source . getAttribute ( "render-query" ) ) ) {
105+ element = queryElements ( {
106+ element : source ,
107+ selector
108+ } ) ;
103109} else if ( source . children . length > 0 ) {
104- for ( const child of source . children ) {
105- if (
106- child . matches (
107- "template, [template], .template, [render]"
108- )
109- ) {
110- element = child ;
111- break ; // Found the desired element, no need to continue the loop.
112- }
113- }
114- }
115-
116- if ( ! element ) {
117- element = source . querySelector (
118- "template, [template], .template, [render]"
110+ element = Array . from ( source . children ) . find ( ( child ) =>
111+ child . matches ( "template, [template], .template, [render]" )
119112) ;
113+ if ( ! element ) {
114+ element = source . querySelector (
115+ "template, [template], .template, [render]"
116+ ) ;
117+ }
120118}
121- } else if ( selector ) element = queryElements ( { selector } ) ;
119+ } else if ( selector ) {
120+ element = queryElements ( {
121+ selector
122+ } ) ;
123+ }
122124
123- if ( ! element || ( Array . isArray ( element ) && ! element . length ) ) return ;
125+ if ( ! element || ( Array . isArray ( element ) && ! element . length ) ) {
126+ return ;
127+ }
124128}
125129
126- if ( source ) {
127- if ( ! key ) {
128- key = source . getAttribute ( "render" ) || source . getAttribute ( "key" ) ;
129- if ( ! key ) {
130- key = data . type ;
131- if ( key == "key" ) key = "object" ;
132- else if ( ! key && data . method ) key = data . method . split ( "." ) [ 0 ] ;
133- else if ( ! key ) return ;
134- } else if ( key == "{}" ) key = "object" ;
130+ if ( ! key ) {
131+ key =
132+ source . getAttribute ( "render" ) ||
133+ source . getAttribute ( " key" ) ||
134+ data . type ;
135+ if ( ! key || key === "key" ) {
136+ key = "object" ;
137+ } else if ( key === "{}" || ( ! key && data . method ) ) {
138+ key = data . method ? data . method . split ( "." ) [ 0 ] : undefined ;
135139}
136- let sourceData = sources . get ( source ) ;
137- if ( ! sourceData ) {
138- sourceData = { element : source , Data } ;
139- sources . set ( source , sourceData ) ;
140+ if ( ! key ) {
141+ return ;
140142}
143+ }
141144
142- source = sourceData ;
143- if ( ! source . data ) {
144- source . data = Data ;
145- }
146- } else if ( data ) {
147- source = { Data } ;
145+ let sourceData = sources . get ( source ) ;
146+ if ( ! sourceData ) {
147+ sourceData = { element : source , data : { ...data } } ;
148+ sources . set ( source , sourceData ) ;
149+ } else if ( sourceData . data ) {
150+ sourceData . data = { ...data } ;
151+ } else {
152+ // TODO: Most effiecientway to comapre too objects or array of objects
153+ if ( data === sourceData . data ) return ;
154+ sourceData . data = { ...data } ;
148155}
156+
149157if ( data . $filter ) {
150158index = index || data . $filter . startingIndex || data . $filter . index ;
151159update = update || data . $filter . update ;
@@ -156,42 +164,41 @@ async function render({
156164! Array . isArray ( element ) &&
157165! ( element instanceof HTMLCollection ) &&
158166! ( element instanceof NodeList )
159- )
167+ ) {
160168element = [ element ] ;
169+ }
161170
162171for ( let i = 0 ; i < element . length ; i ++ ) {
163- key = element [ i ] . getAttribute ( "render" ) || key ;
164-
165172let renderedNode = renderedNodes . get ( element [ i ] ) ;
166- if (
167- renderedNode &&
168- renderedNode . clones &&
169- renderedNode . source &&
170- renderedNode . source . element
171- ) {
172- let limit =
173- renderedNode . source . element . getAttribute ( "render-limit" ) ;
174- if ( limit && renderedNode . clones . size >= parseInt ( limit ) ) continue ;
175- }
176-
177- if ( source ) {
178- if ( ! renderedNode ) {
179- renderedNode = {
180- element : element [ i ] ,
181- source,
182- clones : new Map ( ) ,
183- renderAs : new Map ( )
184- } ;
185- renderedNodes . set ( element [ i ] , renderedNode ) ;
173+ if ( renderedNode ) {
174+ if (
175+ renderedNode . clones &&
176+ renderedNode . source &&
177+ renderedNode . source . element
178+ ) {
179+ let limit =
180+ renderedNode . source . element . getAttribute ( "render-limit" ) ;
181+ if ( limit && renderedNode . clones . size >= parseInt ( limit ) )
182+ continue ;
186183}
184+ } else {
185+ renderedNode = {
186+ element : element [ i ] ,
187+ source : sourceData ,
188+ clones : new Map ( )
189+ } ;
190+ renderedNodes . set ( element [ i ] , renderedNode ) ;
187191}
188192
189- let clones = renderedNode . clones ; // || renderedNode.template.clones
193+ let clones = renderedNode . clones ; // || renderedNode.template.clones..
190194if ( ! clones ) {
191195clones = renderedNode . template . clones ;
192196console . log ( "renderedNode.template.clones" , clones ) ;
193197}
194198
199+ key = element [ i ] . getAttribute ( "render" ) || key ;
200+ let renderType =
201+ renderedNode . source . element . getAttribute ( "render-type" ) ;
195202let clone ;
196203if ( remove ) {
197204for ( let j = 0 ; j < data [ key ] . length ; j ++ ) {
@@ -209,7 +216,10 @@ async function render({
209216renderedNodes . delete ( clone ) ;
210217clone . remove ( ) ;
211218}
212- } else if ( ( key && Array . isArray ( data [ key ] ) ) || Array . isArray ( data ) ) {
219+ } else if (
220+ ( key && ( Array . isArray ( data [ key ] ) || renderType ) ) ||
221+ Array . isArray ( data )
222+ ) {
213223if ( update ) {
214224for ( let j = 0 ; j < data [ key ] . length ; j ++ ) {
215225if ( key === "object" ) {
@@ -253,48 +263,36 @@ async function renderTemplate(template, data, key, index, keyPath) {
253263}
254264
255265templateData . parent = template . parentElement . closest ( "[render]" ) ;
256- if ( templateData . parent )
266+ if ( templateData . parent ) {
257267templateData . parent = renderedNodes . get ( templateData . parent ) ;
268+ }
258269
259270if ( ! templateData . keyPath ) {
260- if ( keyPath ) templateData . keyPath = keyPath ;
261- else if ( templateData . parent && templateData . parent . keyPath )
271+ if ( keyPath ) {
272+ templateData . keyPath = keyPath ;
273+ } else if ( templateData . parent && templateData . parent . keyPath ) {
262274templateData . keyPath = templateData . parent . keyPath ;
263- else if ( key ) templateData . keyPath = key ;
275+ } else if ( key ) {
276+ templateData . keyPath = key ;
277+ }
264278}
265279
266280template = templateData ;
267281
268282let renderData ;
269- if ( key ) renderData = getRenderValue ( template . element , data , key ) ;
270- else if ( Array . isArray ( data ) ) renderData = data ;
271-
272- if ( ! renderData && data )
273- if ( Array . isArray ( data ) ) renderData = data ;
274- else renderData = [ data ] ;
275- else if ( ! renderData ) return ;
283+ if ( key ) {
284+ renderData = getRenderValue ( template . element , data , key ) ;
285+ } else if ( Array . isArray ( data ) ) {
286+ renderData = data ;
287+ }
276288
277- let isInsert = data . $filter && ( data . $filter . create || data . $filter . update ) ;
278- if ( ( ! isInsert && ! index ) || data . $filter . overwrite ) {
279- if ( ! template . clones ) template = template . template ;
280- for ( const [ key , element ] of template . clones ) {
281- renderedNodes . delete ( element ) ;
282- element . remove ( ) ;
283- template . clones . delete ( key ) ;
289+ if ( ! renderData && data ) {
290+ if ( Array . isArray ( data ) ) {
291+ renderData = data ;
292+ } else {
293+ renderData = [ data ] ;
284294}
285- // if (renderedNodes.size) {
286- // for (let [element] of renderedNodes) {
287- // element.remove()
288- // }
289- // renderedNodes.clear();
290- // }
291-
292- // template.data = renderData
293- }
294- // else if (index) {
295- // updates data that has already been rendered
296- // template.data = dotNotationToObject(renderData, template.data)
297- // }
295+ } else if ( ! renderData ) return ;
298296
299297let renderAs = template . element . getAttribute ( "render-as" ) || key ;
300298template . renderAs = renderAs ;
@@ -317,18 +315,43 @@ async function renderTemplate(template, data, key, index, keyPath) {
317315}
318316let reference = template . element . getAttribute ( "render-reference" ) ;
319317
318+ let isInsert = data . $filter && ( data . $filter . create || data . $filter . update ) ;
319+ if ( renderType !== "object" ) {
320+ if ( ( ! isInsert && ! index ) || data . $filter . overwrite ) {
321+ if ( ! template . clones ) template = template . template ;
322+ for ( const [ key , element ] of template . clones ) {
323+ renderedNodes . delete ( element ) ;
324+ element . remove ( ) ;
325+ template . clones . delete ( key ) ;
326+ }
327+ } //
328+ // else if (index) {
329+ // updates data that has already been rendered
330+ // template.data = dotNotationToObject(renderData, template.data)
331+ // }
332+ }
333+
320334if ( ( key && ! Array . isArray ( renderData ) ) || renderType === "object" ) {
321335if ( renderType && Array . isArray ( renderData ) && renderData . length === 1 )
322336renderData = renderData [ 0 ] ;
323337
324338const keys = Object . keys ( renderData ) ;
325339for ( let i = 0 ; i < keys . length ; i ++ ) {
326- if ( exclude . includes ( keys [ i ] ) ) continue ;
340+ let clone = template . clones . get ( keys [ i ] ) ;
341+ clone = renderedNodes . get ( clone ) ;
342+
327343if (
328- reference === "false" &&
329- [ "$storage" , "$database" , "$array" ] . includes ( key )
330- )
344+ exclude . includes ( keys [ i ] ) ||
345+ ( reference === "false" &&
346+ [ "$storage" , "$database" , "$array" ] . includes ( key ) )
347+ ) {
348+ if ( clone ) {
349+ renderedNodes . delete ( clone . element ) ;
350+ clone . element . remove ( ) ;
351+ template . clones . delete ( keys [ i ] ) ;
352+ }
331353continue ;
354+ }
332355
333356let value = renderData [ keys [ i ] ] ;
334357let type = "string" ;
@@ -338,7 +361,16 @@ async function renderTemplate(template, data, key, index, keyPath) {
338361
339362let Data = { [ renderAs ] : { key : keys [ i ] , value, type } } ;
340363
341- let clone = cloneTemplate ( template ) ;
364+ if ( ! clone ) {
365+ clone = cloneTemplate ( template ) ;
366+ } else {
367+ if ( clone . renderedValue === value ) {
368+ continue ;
369+ }
370+ }
371+ clone . renderedValue = value ;
372+ // let clone = cloneTemplate(template);
373+
342374let renderedKey = key . split ( "." ) ;
343375renderedKey = renderedKey [ renderedKey . length - 1 ] ;
344376//renderedKey needs to remove the parent.renderAs/key
0 commit comments