1+ /* eslint-disable */
12import { createOptimizedPicture } from '../../scripts/aem.js' ;
23
34export default async function decorate ( block ) {
45 const spreadsheetLink = block . querySelector ( 'a' ) ?. href ;
56 block . textContent = '' ;
67
8+ // Create and append a global modal to the body (once)
9+ const tagModal = document . createElement ( 'div' ) ;
10+ tagModal . className = 'tag-modal' ;
11+ tagModal . innerHTML = `
12+ <div class="tag-modal-content">
13+ <span class="tag-modal-close">×</span>
14+ <div class="tag-modal-body">
15+ <p>Loading...</p>
16+ </div>
17+ </div>
18+ ` ;
19+ document . body . appendChild ( tagModal ) ;
20+
21+ // Close modal on clicking close button
22+ tagModal . querySelector ( '.tag-modal-close' ) . addEventListener ( 'click' , ( ) => {
23+ tagModal . classList . remove ( 'show' ) ;
24+ tagModal . querySelector ( '.tag-modal-body' ) . innerHTML = '<p>Loading...</p>' ;
25+ } ) ;
26+
727 async function fetchJson ( link ) {
828 const response = await fetch ( link ) ;
929 if ( response . ok ) {
@@ -19,17 +39,14 @@ export default async function decorate(block) {
1939 const displayAdAssets = [ ] ;
2040 const metaAdAssets = [ ] ;
2141
22- // Email assets
2342 if ( item . Email1Pod ) emailAssets . push ( { key : 'Email1Pod' , value : item . Email1Pod } ) ;
2443 if ( item . Email2Pod ) emailAssets . push ( { key : 'Email2Pod' , value : item . Email2Pod } ) ;
2544 if ( item . Email3Pod ) emailAssets . push ( { key : 'Email3Pod' , value : item . Email3Pod } ) ;
2645
27- // Display Ad assets
2846 if ( item . DisplayAd300x600 ) displayAdAssets . push ( { key : 'DisplayAd300x600' , value : item . DisplayAd300x600 } ) ;
2947 if ( item . DisplayAd300x250 ) displayAdAssets . push ( { key : 'DisplayAd300x250' , value : item . DisplayAd300x250 } ) ;
3048 if ( item . DisplayAd970x250 ) displayAdAssets . push ( { key : 'DisplayAd970x250' , value : item . DisplayAd970x250 } ) ;
3149
32- // Meta Ad assets
3350 if ( item . MetaAd1x1 ) metaAdAssets . push ( { key : 'MetaAd1x1' , value : item . MetaAd1x1 } ) ;
3451 if ( item . MetaAd4x5 ) metaAdAssets . push ( { key : 'MetaAd4x5' , value : item . MetaAd4x5 } ) ;
3552 if ( item . MetaAd9x16 ) metaAdAssets . push ( { key : 'MetaAd9x16' , value : item . MetaAd9x16 } ) ;
@@ -46,8 +63,6 @@ export default async function decorate(block) {
4663 function createCards ( data ) {
4764 const ul = document . createElement ( 'ul' ) ;
4865
49- console . log ( "data: " , data ) ;
50-
5166 data . forEach ( ( item ) => {
5267 const hasDisplayAd = item . DisplayAd === 'true' ;
5368 const hasEmail = item . Email === 'true' ;
@@ -83,7 +98,7 @@ export default async function decorate(block) {
8398 ` : '' }
8499
85100 ${ item . displayAdAssets . length ? `
86- <div template-type>
101+ <div class=" template-type" >
87102 Display Ad
88103 <div class="tags">
89104 ${ item . displayAdAssets . map ( ( asset ) => `<span class="tag tag-display" title="${ asset . key } " data-src="${ asset . value } ">${ asset . key } </span>` ) . join ( '' ) }
@@ -92,15 +107,14 @@ export default async function decorate(block) {
92107 ` : '' }
93108
94109 ${ item . metaAdAssets . length ? `
95- <div template-type>
110+ <div class=" template-type" >
96111 Meta Ad
97112 <div class="tags">
98113 ${ item . metaAdAssets . map ( ( asset ) => `<span class="tag tag-meta" title="${ asset . key } " data-src="${ asset . value } ">${ asset . key } </span>` ) . join ( '' ) }
99114 </div>
100115 </div>
101116 ` : '' }
102117 </div>
103-
104118 </div>
105119 </div>
106120 </div>
@@ -115,20 +129,45 @@ export default async function decorate(block) {
115129 </div>
116130 ` ;
117131
132+ // Flip interaction
118133 li . addEventListener ( 'click' , ( ) => {
119- // Unflip any currently flipped cards
120134 const allFlipped = ul . querySelectorAll ( '.flip-inner.flipped' ) ;
121135 allFlipped . forEach ( ( flipped ) => {
122136 if ( flipped !== li . querySelector ( '.flip-inner' ) ) {
123137 flipped . classList . remove ( 'flipped' ) ;
124138 }
125139 } ) ;
126140
127- // Toggle flip on the current card
128141 const flipContainer = li . querySelector ( '.flip-inner' ) ;
129142 flipContainer . classList . toggle ( 'flipped' ) ;
130143 } ) ;
131144
145+ // Modal tag interaction
146+ li . querySelectorAll ( '.tag' ) . forEach ( ( tagEl ) => {
147+ tagEl . addEventListener ( 'click' , ( e ) => {
148+ e . stopPropagation ( ) ;
149+
150+ const assetTitle = tagEl . getAttribute ( 'title' ) ;
151+ const assetSrc = tagEl . getAttribute ( 'data-src' ) ;
152+
153+ const modalBody = tagModal . querySelector ( '.tag-modal-body' ) ;
154+ modalBody . innerHTML = `
155+ <h3>${ assetTitle } </h3>
156+ ${
157+ assetSrc . match ( / \. ( j p g | j p e g | p n g | g i f | w e b p ) $ / i)
158+ ? `<img src="${ assetSrc } "
159+ alt="${ assetTitle } "
160+ loading="eager"
161+ decoding="async"
162+ style="max-width: 100%; margin-top: 1em;">`
163+ : `<p><em>Preview unavailable</em></p>`
164+ }
165+ ` ;
166+
167+ tagModal . classList . add ( 'show' ) ;
168+ } ) ;
169+ } ) ;
170+
132171 ul . append ( li ) ;
133172 } ) ;
134173
0 commit comments