@@ -26,6 +26,108 @@ function init(element) {
2626 }
2727}
2828
29+ function render ( { source, element, data, key, index, currentIndex, update, remove } ) {
30+ if ( ! element ) {
31+ if ( source ) {
32+ element = queryElements ( { element : source , prefix : 'render' } )
33+ if ( ! element && source . children . length > 0 ) {
34+ for ( const child of source . children ) {
35+ if ( child . matches ( 'template, [template], .template, [render]' ) ) {
36+ element = child ;
37+ break ; // Found the desired element, no need to continue the loop
38+ }
39+ }
40+ }
41+
42+ if ( ! element ) {
43+ element = source . querySelector ( 'template, [template], .template, [render]' ) ;
44+ }
45+ }
46+
47+ if ( ! element ) return ;
48+ }
49+
50+ if ( source ) {
51+ let sourceData = sources . get ( source )
52+ if ( ! sourceData ) {
53+ sourceData = { element : source , data }
54+ sources . set ( source , sourceData )
55+ }
56+
57+ source = sourceData
58+ if ( ! source . data )
59+ source . data = data
60+ } else if ( data )
61+ source = { data }
62+
63+ if ( data . filter ) {
64+ index = index || data . filter . index
65+ update = update || data . filter . update
66+ remove = remove || data . filter . remove
67+ }
68+
69+ if ( ! Array . isArray ( element ) && ! ( element instanceof HTMLCollection ) && ! ( element instanceof NodeList ) )
70+ element = [ element ]
71+
72+ for ( let i = 0 ; i < element . length ; i ++ ) {
73+ if ( ! key )
74+ key = element [ i ] . getAttribute ( 'render' )
75+
76+ let renderedNode = renderedNodes . get ( element [ i ] )
77+ if ( source ) {
78+ if ( ! renderedNode ) {
79+ renderedNode = { element : element [ i ] , source, clones : new Map ( ) , renderAs : new Map ( ) }
80+ renderedNodes . set ( element [ i ] , renderedNode )
81+ }
82+ }
83+
84+ if ( remove ) {
85+ if ( renderedNode . source ) {
86+ if ( key )
87+ renderedNode . source . data [ key ] . splice ( index , 1 )
88+ else {
89+
90+ }
91+ }
92+
93+ let clone = Array . from ( renderedNode . clones ) [ index ]
94+ if ( ! clone ) return
95+
96+ renderedNode . clones . delete ( clone [ 0 ] )
97+ renderedNodes . delete ( clone [ 1 ] )
98+ clone [ 1 ] . remove ( )
99+ } else if ( key ) {
100+ if ( update ) {
101+ let clone
102+
103+ if ( ! currentIndex )
104+ currentIndex = data . filter . currentIndex
105+
106+ if ( currentIndex >= 0 )
107+ clone = Array . from ( renderedNode . clones ) [ currentIndex ]
108+ else
109+ clone = Array . from ( renderedNode . clones ) [ index ]
110+
111+ if ( ! clone ) return
112+
113+ renderValues ( clone [ 1 ] , data ) ;
114+ if ( currentIndex >= 0 )
115+ insertElement ( renderedNode , clone [ 1 ] , index , currentIndex )
116+ }
117+
118+ // TODO: if $auto here every subsequent clone will have same value, not replacing here will apply unique value to each clone
119+ if ( key === '$auto' )
120+ key = key . replace ( / \$ a u t o / g, uuid . generate ( 6 ) ) ;
121+
122+ element [ i ] . setAttribute ( 'render' , key ) ;
123+
124+ renderTemplate ( element [ i ] , data , key , index ) ;
125+ } else
126+ renderValues ( element [ i ] , data ) ;
127+
128+ }
129+
130+ }
29131
30132function renderTemplate ( template , data , key , index , keyPath ) {
31133 if ( ! key )
@@ -474,98 +576,6 @@ function getRenderValue(node, data, key, renderAs) {
474576// render({ source, selector, element, data, key, index, update, remove })
475577// }
476578
477- function render ( { source, element, data, key, index, currentIndex, update, remove } ) {
478- if ( ! element ) {
479- if ( source ) {
480- element = queryElements ( source , 'render' )
481- if ( ! element )
482- element = source . querySelector ( 'template, [template], .template' , '[render]' )
483- }
484-
485- if ( ! element ) return ;
486- }
487-
488- if ( source ) {
489- let sourceData = sources . get ( source )
490- if ( ! sourceData ) {
491- sourceData = { element : source , data }
492- sources . set ( source , sourceData )
493- }
494-
495- source = sourceData
496- if ( ! source . data )
497- source . data = data
498- } else if ( data )
499- source = { data }
500-
501- if ( data . filter ) {
502- index = index || data . filter . index
503- update = update || data . filter . update
504- remove = remove || data . filter . remove
505- }
506-
507- if ( ! Array . isArray ( element ) && ! ( element instanceof HTMLCollection ) && ! ( element instanceof NodeList ) )
508- element = [ element ]
509-
510- for ( let i = 0 ; i < element . length ; i ++ ) {
511- if ( ! key )
512- key = element [ i ] . getAttribute ( 'render' )
513-
514- let renderedNode = renderedNodes . get ( element [ i ] )
515- if ( source ) {
516- if ( ! renderedNode ) {
517- renderedNode = { element : element [ i ] , source, clones : new Map ( ) , renderAs : new Map ( ) }
518- renderedNodes . set ( element [ i ] , renderedNode )
519- }
520- }
521-
522- if ( remove ) {
523- if ( renderedNode . source ) {
524- if ( key )
525- renderedNode . source . data [ key ] . splice ( index , 1 )
526- else {
527-
528- }
529- }
530-
531- let clone = Array . from ( renderedNode . clones ) [ index ]
532- if ( ! clone ) return
533-
534- renderedNode . clones . delete ( clone [ 0 ] )
535- renderedNodes . delete ( clone [ 1 ] )
536- clone [ 1 ] . remove ( )
537- } else if ( key ) {
538- if ( update ) {
539- let clone
540-
541- if ( ! currentIndex )
542- currentIndex = data . filter . currentIndex
543-
544- if ( currentIndex >= 0 )
545- clone = Array . from ( renderedNode . clones ) [ currentIndex ]
546- else
547- clone = Array . from ( renderedNode . clones ) [ index ]
548-
549- if ( ! clone ) return
550-
551- renderValues ( clone [ 1 ] , data ) ;
552- if ( currentIndex >= 0 )
553- insertElement ( renderedNode , clone [ 1 ] , index , currentIndex )
554- }
555-
556- // TODO: if $auto here every subsequent clone will have same value, not replacing here will apply unique value to each clone
557- if ( key === '$auto' )
558- key = key . replace ( / \$ a u t o / g, uuid . generate ( 6 ) ) ;
559-
560- element [ i ] . setAttribute ( 'render' , key ) ;
561-
562- renderTemplate ( element [ i ] , data , key , index ) ;
563- } else
564- renderValues ( element [ i ] , data ) ;
565-
566- }
567-
568- }
569579
570580function renderKey ( element , params ) {
571581 // TODO: custom render-keys
0 commit comments