@@ -108,7 +108,99 @@ test.describe('Product card', async () => {
108
108
</ div >
109
109
` , { ignoreCardToolbarContents : true , ignoreInnerSVG : true } ) ;
110
110
} ) ;
111
+ test ( 'can import serialized product card nodes with a br' , async function ( ) {
112
+ const contentParam = encodeURIComponent ( JSON . stringify ( {
113
+ root : {
114
+ children : [ {
115
+ type : 'product' ,
116
+ productImageSrc : '/content/images/2022/11/koenig-lexical.jpg' ,
117
+ productTitle : '<span>This is <em>title</em></span><br /><span>Second line</span>' ,
118
+ productDescription : '<p dir="ltr"><span>Description</span><br /><span>Moar description</span></p>' ,
119
+ productUrl : 'https://google.com/' ,
120
+ productButton : 'Button' ,
121
+ productButtonEnabled : true ,
122
+ productRatingEnabled : true ,
123
+ productStarRating : 4
124
+ } ] ,
125
+ direction : null ,
126
+ format : '' ,
127
+ indent : 0 ,
128
+ type : 'root' ,
129
+ version : 1
130
+ }
131
+ } ) ) ;
132
+
133
+ await initialize ( { page, uri : `/#/?content=${ contentParam } ` } ) ;
111
134
135
+ await assertHTML ( page , html `
136
+ < div data-lexical-decorator ="true " contenteditable ="false ">
137
+ < div
138
+ data-kg-card-editing ="false "
139
+ data-kg-card-selected ="false "
140
+ data-kg-card ="product ">
141
+ < div >
142
+ < div >
143
+ < img
144
+ alt ="Product thumbnail "
145
+ src ="/content/images/2022/11/koenig-lexical.jpg " />
146
+ </ div >
147
+ < div >
148
+ < div >
149
+ < div >
150
+ < div data-kg ="editor ">
151
+ < div
152
+ contenteditable ="false "
153
+ role ="textbox "
154
+ spellcheck ="true "
155
+ data-lexical-editor ="true "
156
+ aria-autocomplete ="none "
157
+ aria-readonly ="true ">
158
+ < p dir ="ltr ">
159
+ < span data-lexical-text ="true "> This is</ span >
160
+ < em data-lexical-text ="true "> title</ em >
161
+ < br />
162
+ < span data-lexical-text ="true "> Second line</ span >
163
+ </ p >
164
+ </ div >
165
+ </ div >
166
+ </ div >
167
+ </ div >
168
+ < div >
169
+ < button type ="button "> < svg > </ svg > </ button >
170
+ < button type ="button "> < svg > </ svg > </ button >
171
+ < button type ="button "> < svg > </ svg > </ button >
172
+ < button type ="button "> < svg > </ svg > </ button >
173
+ < button type ="button "> < svg > </ svg > </ button >
174
+ </ div >
175
+ </ div >
176
+ < div >
177
+ < div >
178
+ < div data-kg ="editor ">
179
+ < div
180
+ contenteditable ="false "
181
+ role ="textbox "
182
+ spellcheck ="true "
183
+ data-lexical-editor ="true "
184
+ aria-autocomplete ="none "
185
+ aria-readonly ="true ">
186
+ < p dir ="ltr ">
187
+ < span data-lexical-text ="true "> Description</ span >
188
+ < br />
189
+ < span data-lexical-text ="true "> Moar description</ span >
190
+ </ p >
191
+ </ div >
192
+ </ div >
193
+ </ div >
194
+ </ div >
195
+ < div >
196
+ < a href ="https://google.com/ "> < span > Button</ span > </ a >
197
+ </ div >
198
+ </ div >
199
+ < div > </ div >
200
+ </ div >
201
+ </ div >
202
+ ` , { ignoreCardToolbarContents : true , ignoreInnerSVG : true } ) ;
203
+ } ) ;
112
204
test ( 'renders product card node' , async function ( ) {
113
205
await focusEditor ( page ) ;
114
206
await insertCard ( page , { cardName : 'product' } ) ;
@@ -454,6 +546,107 @@ test.describe('Product card', async () => {
454
546
< p > < br /> </ p >
455
547
` , { ignoreCardToolbarContents : true , ignoreInnerSVG : true } ) ;
456
548
} ) ;
549
+ test ( 'can handle new shift-enter in title and description' , async ( ) => {
550
+ await focusEditor ( page ) ;
551
+ await insertCard ( page , { cardName : 'product' } ) ;
552
+
553
+ await page . keyboard . type ( 'Test title' ) ;
554
+ await page . keyboard . press ( 'Shift+Enter' ) ;
555
+ await page . keyboard . type ( 'Second line of title' ) ;
556
+
557
+ await page . keyboard . press ( 'Enter' ) ;
558
+ await page . keyboard . type ( 'Test description' ) ;
559
+ await page . keyboard . press ( 'Shift+Enter' ) ;
560
+ await page . keyboard . type ( 'Second line of description' ) ;
561
+ await assertHTML ( page , html `
562
+ < div data-lexical-decorator ="true " contenteditable ="false ">
563
+ < div
564
+ data-kg-card-editing ="true "
565
+ data-kg-card-selected ="true "
566
+ data-kg-card ="product ">
567
+ < div >
568
+ < div >
569
+ < div >
570
+ < div >
571
+ < button name ="placeholder-button " type ="button ">
572
+ < svg > </ svg >
573
+ < p > Click to select a product image</ p >
574
+ </ button >
575
+ </ div >
576
+ </ div >
577
+ < form >
578
+ < input
579
+ accept ="image/gif,image/jpg,image/jpeg,image/png,image/svg+xml,image/webp "
580
+ hidden =""
581
+ name ="image-input "
582
+ type ="file " />
583
+ </ form >
584
+ </ div >
585
+ < div >
586
+ < div >
587
+ < div >
588
+ < div data-kg ="editor ">
589
+ < div
590
+ contenteditable ="true "
591
+ role ="textbox "
592
+ spellcheck ="true "
593
+ data-lexical-editor ="true "
594
+ >
595
+ < p dir ="ltr ">
596
+ < span data-lexical-text ="true "> Test title</ span >
597
+ < br />
598
+ < span data-lexical-text ="true "> Second line of title</ span >
599
+ </ p >
600
+ </ div >
601
+ </ div >
602
+ </ div >
603
+ </ div >
604
+ </ div >
605
+ < div >
606
+ < div >
607
+ < div data-kg ="editor ">
608
+ < div
609
+ contenteditable ="true "
610
+ role ="textbox "
611
+ spellcheck ="true "
612
+ data-lexical-editor ="true "
613
+ >
614
+ < p dir ="ltr "> < span data-lexical-text ="true "> Test description</ span >
615
+ < br />
616
+ < span data-lexical-text ="true "> Second line of description</ span >
617
+ </ p >
618
+ </ div >
619
+ </ div >
620
+ </ div >
621
+ </ div >
622
+ </ div >
623
+ < div >
624
+ < div draggable ="true ">
625
+ < label >
626
+ < div > < div > Rating</ div > </ div >
627
+ < div >
628
+ < label id ="product-rating-toggle ">
629
+ < input type ="checkbox " />
630
+ < div > </ div >
631
+ </ label >
632
+ </ div >
633
+ </ label >
634
+ < label >
635
+ < div > < div > Button</ div > </ div >
636
+ < div >
637
+ < label id ="product-button-toggle ">
638
+ < input type ="checkbox " />
639
+ < div > </ div >
640
+ </ label >
641
+ </ div >
642
+ </ label >
643
+ </ div >
644
+ </ div >
645
+ </ div >
646
+ </ div >
647
+ < p > < br /> </ p >
648
+ ` , { ignoreCardToolbarContents : true , ignoreInnerSVG : true } ) ;
649
+ } ) ;
457
650
} ) ;
458
651
459
652
async function uploadImg ( page , src = 'large-image.png' ) {
0 commit comments