@@ -40,6 +40,7 @@ vi.mock("../../generators/generatePseudoEditableField", () => ({
4040 generatePseudoEditableElement : vi . fn ( ( ) => {
4141 const pseudoElement = document . createElement ( "div" ) ;
4242 pseudoElement . setAttribute ( "data-testid" , "pseudo-element" ) ;
43+ pseudoElement . className = "visual-builder__pseudo-editable-element" ;
4344 return pseudoElement ;
4445 } ) ,
4546 isEllipsisActive : vi . fn ( ( ) => false ) ,
@@ -276,4 +277,116 @@ describe("enableInlineEditing", () => {
276277 VisualBuilder . VisualBuilderGlobalState . value . focusFieldValue
277278 ) . toBe ( "Test content" ) ;
278279 } ) ;
280+
281+ it ( "should create pseudo element when field is last edited" , ( ) => {
282+ document . body . appendChild ( editableElement ) ;
283+ editableElement . setAttribute ( "data-cs-last-edited" , "true" ) ;
284+
285+ enableInlineEditing ( {
286+ expectedFieldData : "Test content" ,
287+ editableElement,
288+ fieldType : FieldDataType . SINGLELINE ,
289+ elements : {
290+ visualBuilderContainer,
291+ resizeObserver,
292+ lastEditedField : null ,
293+ } ,
294+ } ) ;
295+
296+ expect ( generatePseudoEditableElement ) . toHaveBeenCalled ( ) ;
297+ expect ( editableElement . style . visibility ) . toBe ( "hidden" ) ;
298+ expect ( resizeObserver . observe ) . toHaveBeenCalled ( ) ;
299+
300+ document . body . removeChild ( editableElement ) ;
301+ } ) ;
302+
303+ it ( "should set data-cs-last-edited attribute on editable element" , ( ) => {
304+ enableInlineEditing ( {
305+ expectedFieldData : "Test content" ,
306+ editableElement,
307+ fieldType : FieldDataType . SINGLELINE ,
308+ elements : {
309+ visualBuilderContainer,
310+ resizeObserver,
311+ lastEditedField : null ,
312+ } ,
313+ } ) ;
314+
315+ expect ( editableElement . getAttribute ( "data-cs-last-edited" ) ) . toBe ( "true" ) ;
316+ } ) ;
317+
318+ it ( "should create pseudo element when field is last edited even with same content" , ( ) => {
319+ document . body . appendChild ( editableElement ) ;
320+ editableElement . setAttribute ( "data-cs-last-edited" , "true" ) ;
321+ editableElement . textContent = "Test content" ;
322+ editableElement . innerText = "Test content" ;
323+
324+ enableInlineEditing ( {
325+ expectedFieldData : "Test content" ,
326+ editableElement,
327+ fieldType : FieldDataType . SINGLELINE ,
328+ elements : {
329+ visualBuilderContainer,
330+ resizeObserver,
331+ lastEditedField : null ,
332+ } ,
333+ } ) ;
334+
335+ expect ( generatePseudoEditableElement ) . toHaveBeenCalled ( ) ;
336+ expect ( editableElement . style . visibility ) . toBe ( "hidden" ) ;
337+
338+ document . body . removeChild ( editableElement ) ;
339+ } ) ;
340+
341+ it ( "should not create pseudo element when field is not last edited and content matches" , ( ) => {
342+ const otherElement = document . createElement ( "div" ) ;
343+ otherElement . setAttribute ( "data-cs-last-edited" , "true" ) ;
344+ document . body . appendChild ( otherElement ) ;
345+
346+ editableElement . textContent = "Test content" ;
347+ editableElement . innerText = "Test content" ;
348+
349+ enableInlineEditing ( {
350+ expectedFieldData : "Test content" ,
351+ editableElement,
352+ fieldType : FieldDataType . SINGLELINE ,
353+ elements : {
354+ visualBuilderContainer,
355+ resizeObserver,
356+ lastEditedField : null ,
357+ } ,
358+ } ) ;
359+
360+ expect ( generatePseudoEditableElement ) . not . toHaveBeenCalled ( ) ;
361+ expect ( editableElement . style . visibility ) . toBe ( "" ) ;
362+ expect ( editableElement . getAttribute ( "data-cs-last-edited" ) ) . toBe ( "true" ) ;
363+
364+ document . body . removeChild ( otherElement ) ;
365+ } ) ;
366+
367+ it ( "should not create nested pseudo elements when pseudo element is clicked" , ( ) => {
368+ document . body . appendChild ( editableElement ) ;
369+ editableElement . setAttribute ( "data-cs-last-edited" , "true" ) ;
370+
371+ enableInlineEditing ( {
372+ expectedFieldData : "Test content" ,
373+ editableElement,
374+ fieldType : FieldDataType . SINGLELINE ,
375+ elements : {
376+ visualBuilderContainer,
377+ resizeObserver,
378+ lastEditedField : null ,
379+ } ,
380+ } ) ;
381+
382+ expect ( generatePseudoEditableElement ) . toHaveBeenCalled ( ) ;
383+ expect ( editableElement . style . visibility ) . toBe ( "hidden" ) ;
384+
385+ const pseudoElement = visualBuilderContainer . querySelector ( ".visual-builder__pseudo-editable-element" ) ;
386+ expect ( pseudoElement ) . toBeTruthy ( ) ;
387+ expect ( pseudoElement ?. getAttribute ( "data-cslp" ) ) . toBeNull ( ) ;
388+ expect ( editableElement . getAttribute ( "data-cs-last-edited" ) ) . toBe ( "true" ) ;
389+
390+ document . body . removeChild ( editableElement ) ;
391+ } ) ;
279392} ) ;
0 commit comments