@@ -453,11 +453,45 @@ describe('nested template', () => {
453453 </ ComponentWithTemplates > ,
454454 ) ;
455455
456- const options = WidgetClass . mock . calls [ 0 ] [ 1 ] ;
456+ let options = WidgetClass . mock . calls [ 0 ] [ 1 ] ;
457457
458458 expect ( options . item ) . toBeUndefined ( ) ;
459459
460- const { integrationOptions } = options ;
460+ let { integrationOptions } = options ;
461+
462+ expect ( integrationOptions ) . toBeDefined ( ) ;
463+ expect ( integrationOptions . templates ) . toBeDefined ( ) ;
464+
465+ expect ( integrationOptions . templates . item1 ) . toBeDefined ( ) ;
466+ expect ( typeof integrationOptions . templates . item1 . render ) . toBe ( 'function' ) ;
467+
468+ expect ( integrationOptions . templates . item2 ) . toBeDefined ( ) ;
469+ expect ( typeof integrationOptions . templates . item2 . render ) . toBe ( 'function' ) ;
470+
471+ expect ( integrationOptions . templates . item3 ) . toBeDefined ( ) ;
472+ expect ( typeof integrationOptions . templates . item3 . render ) . toBe ( 'function' ) ;
473+
474+ const MySetOfTemplates = ( ) => (
475+ < >
476+ < Template name = "item1" render = { ItemTemplate } />
477+ < Template name = "item2" component = { ItemTemplate } />
478+ < Template name = "item3" >
479+ < ItemTemplate />
480+ </ Template >
481+ </ >
482+ ) ;
483+
484+ render (
485+ < ComponentWithTemplates >
486+ < MySetOfTemplates />
487+ </ ComponentWithTemplates > ,
488+ ) ;
489+
490+ options = WidgetClass . mock . calls [ 1 ] [ 1 ] ;
491+
492+ expect ( options . item ) . toBeUndefined ( ) ;
493+
494+ ( { integrationOptions } = options ) ;
461495
462496 expect ( integrationOptions ) . toBeDefined ( ) ;
463497 expect ( integrationOptions . templates ) . toBeDefined ( ) ;
@@ -475,7 +509,7 @@ describe('nested template', () => {
475509 it ( 'renders nested templates' , ( ) => {
476510 const ref = React . createRef < HTMLDivElement > ( ) ;
477511 const FirstTemplate = ( ) => < div className = "template" > Template</ div > ;
478- const { container } = render (
512+ let { container } = render (
479513 < ComponentWithTemplates >
480514 < Template name = "item1" render = { FirstTemplate } />
481515 < div ref = { ref } />
@@ -484,11 +518,27 @@ describe('nested template', () => {
484518 act ( ( ) => { renderTemplate ( 'item1' , undefined , ref . current ) ; } ) ;
485519
486520 expect ( container . querySelector ( '.template' ) ?. outerHTML ) . toBe ( '<div class="template">Template</div>' ) ;
521+
522+ const MyCustomComponent = ( ) => (
523+ < >
524+ < Template name = "item1" render = { FirstTemplate } />
525+ < div ref = { ref } />
526+ </ >
527+ ) ;
528+
529+ ( { container } = render (
530+ < ComponentWithTemplates >
531+ < MyCustomComponent />
532+ </ ComponentWithTemplates > ,
533+ ) ) ;
534+ act ( ( ) => { renderTemplate ( 'item1' , undefined , ref . current ) ; } ) ;
535+
536+ expect ( container . querySelector ( '.template' ) ?. outerHTML ) . toBe ( '<div class="template">Template</div>' ) ;
487537 } ) ;
488538
489539 it ( 'renders children of nested template' , ( ) => {
490540 const ref = React . createRef < HTMLDivElement > ( ) ;
491- const { container } = render (
541+ let { container } = render (
492542 < ComponentWithTemplates >
493543 < Template name = "item1" >
494544 < div className = "template" > Template</ div >
@@ -498,6 +548,25 @@ describe('nested template', () => {
498548 ) ;
499549 act ( ( ) => { renderTemplate ( 'item1' , undefined , ref . current ) ; } ) ;
500550
551+ expect ( container . querySelector ( '.template' ) ?. outerHTML )
552+ . toBe ( '<div class="template">Template</div>' ) ;
553+
554+ const MyCustomComponent = ( ) => (
555+ < >
556+ < Template name = "item1" >
557+ < div className = "template" > Template</ div >
558+ </ Template >
559+ < div ref = { ref } />
560+ </ >
561+ ) ;
562+
563+ ( { container } = render (
564+ < ComponentWithTemplates >
565+ < MyCustomComponent />
566+ </ ComponentWithTemplates > ,
567+ ) ) ;
568+ act ( ( ) => { renderTemplate ( 'item1' , undefined , ref . current ) ; } ) ;
569+
501570 expect ( container . querySelector ( '.template' ) ?. outerHTML )
502571 . toBe ( '<div class="template">Template</div>' ) ;
503572 } ) ;
@@ -587,6 +656,28 @@ describe('component/render in nested options', () => {
587656
588657 NestedComponent . componentType = 'option' ;
589658
659+ const LeafNestedComponent = function NestedComponent ( props : any ) {
660+ return (
661+ < ConfigurationComponent < {
662+ item ?: any ;
663+ itemRender ?: any ;
664+ itemComponent ?: any ;
665+ } & React . PropsWithChildren >
666+ elementDescriptor = { {
667+ OptionName : 'leafOption' ,
668+ TemplateProps : [ {
669+ tmplOption : 'item' ,
670+ render : 'itemRender' ,
671+ component : 'itemComponent' ,
672+ } ] ,
673+ } }
674+ { ...props }
675+ />
676+ ) ;
677+ } as React . ComponentType < any > & NestedComponentMeta ;
678+
679+ LeafNestedComponent . componentType = 'option' ;
680+
590681 const CollectionNestedComponent = function CollectionNestedComponent ( props : any ) {
591682 return (
592683 < ConfigurationComponent < {
@@ -654,6 +745,61 @@ describe('component/render in nested options', () => {
654745 expect ( typeof integrationOptions . templates [ 'option.item' ] . render ) . toBe ( 'function' ) ;
655746 } ) ;
656747
748+ it ( 'pass integrationOptions from its nested Template component to widget' , ( ) => {
749+ const ItemTemplate = ( ) => < div > Template</ div > ;
750+ render (
751+ < ComponentWithTemplates >
752+ < NestedComponent item = 'myTemplate' >
753+ < Template name = 'myTemplate' render = { ItemTemplate } />
754+ </ NestedComponent >
755+ < LeafNestedComponent item = 'leafOptionTemplate' >
756+ < Template name = 'leafOptionTemplate' render = { ItemTemplate } />
757+ </ LeafNestedComponent >
758+ </ ComponentWithTemplates > ,
759+ ) ;
760+
761+ let options = WidgetClass . mock . calls [ 0 ] [ 1 ] ;
762+ let { integrationOptions } = options ;
763+
764+ expect ( integrationOptions . templates . myTemplate ) . toBeDefined ( ) ;
765+ expect ( typeof integrationOptions . templates . myTemplate . render ) . toBe ( 'function' ) ;
766+
767+ expect ( integrationOptions . templates . leafOptionTemplate ) . toBeDefined ( ) ;
768+ expect ( typeof integrationOptions . templates . leafOptionTemplate . render ) . toBe ( 'function' ) ;
769+
770+ expect ( options . option . item ) . toBe ( 'myTemplate' ) ;
771+ expect ( options . leafOption . item ) . toBe ( 'leafOptionTemplate' ) ;
772+
773+ const MyCustomComponent = ( ) => (
774+ < >
775+ < NestedComponent item = 'myTemplate' >
776+ < Template name = 'myTemplate' render = { ItemTemplate } />
777+ </ NestedComponent >
778+ < LeafNestedComponent item = 'leafOptionTemplate' >
779+ < Template name = 'leafOptionTemplate' render = { ItemTemplate } />
780+ </ LeafNestedComponent >
781+ </ >
782+ ) ;
783+
784+ render (
785+ < ComponentWithTemplates >
786+ < MyCustomComponent />
787+ </ ComponentWithTemplates > ,
788+ ) ;
789+
790+ options = WidgetClass . mock . calls [ 1 ] [ 1 ] ;
791+ ( { integrationOptions } = options ) ;
792+
793+ expect ( integrationOptions . templates . myTemplate ) . toBeDefined ( ) ;
794+ expect ( typeof integrationOptions . templates . myTemplate . render ) . toBe ( 'function' ) ;
795+
796+ expect ( integrationOptions . templates . leafOptionTemplate ) . toBeDefined ( ) ;
797+ expect ( typeof integrationOptions . templates . leafOptionTemplate . render ) . toBe ( 'function' ) ;
798+
799+ expect ( options . option . item ) . toBe ( 'myTemplate' ) ;
800+ expect ( options . leafOption . item ) . toBe ( 'leafOptionTemplate' ) ;
801+ } ) ;
802+
657803 it ( 'pass integrationOptions options to widget with several templates' , ( ) => {
658804 const UserTemplate = ( ) => < div > Template</ div > ;
659805 render (
0 commit comments