1window.drupalScripts.push(function ($) { 2 (function ($) { 3 $('document').ready(function () { 4 window.didomiOnReady.push(function (Didomi) { 5 if (!Didomi.notice.isVisible()) { 6 console.log("Didomi notice is not visible"); 7 setTimeout(function() { 8 froomle_ab_test_router(); 9 console.log("Froomle lancé après 2s d'attente"); 10 }, 2000); 11 } else { 12 console.log("Didomi notice is visible"); 13 // event listener la popup didomi est fermé 14 window.didomiEventListeners = window.didomiEventListeners || []; 15 window.didomiEventListeners.push({ 16 event: 'notice.hidden', 17 listener: function () { 18 // the notice has been hidden 19 if (!Drupal.settings.ena_froomle.is_loaded_recom) { 20 console.log("Didomi notice has been hidden"); 21 setTimeout(function() { 22 froomle_ab_test_router(); 23 console.log("Froomle lancé après 2s d'attente (Didomi)"); 24 }, 2000); 25 } 26 } 27 }); // fin event listener la popup didomi est fermé 28 } 29 }); 30 31 // ROUTEUR AB TEST : Choisit la bonne fonction selon le groupe défini par Kameleoon 32 function froomle_ab_test_router() { 33 console.log("froomle_ab_test_router called"); 34 var group = (typeof window.froomleTestGroup === 'string') ? window.froomleTestGroup : null; 35 if (group === 'froomle_1') { 36 console.log("Running froomle_1 variant"); 37 runFroomleFroomle1(); 38 } else if (group === 'froomle_2') { 39 console.log("Running froomle_2 variant"); 40 runFroomleFroomle2(); 41 } else if (group === 'customer') { 42 console.log("Running customer variant"); 43 runFroomleCustomer(); 44 } else { 45 console.log("Running legacy variant"); 46 ena_froomle_recommendations(); // legacy 47 } 48 } 49 window.froomle_ab_test_router = froomle_ab_test_router; // <-- expose la fonction en global 50 51 // LOGIQUE GROUPE "customer" (DPI only) 52 function runFroomleCustomer() { 53 console.log("Running customer variant"); 54 window.froomle_ab_group = 'customer'; 55 runFroomleWithGroup('customer'); 56 } 57 58 // LOGIQUE GROUPE "froomle_1" (mixed) 59 function runFroomleFroomle1() { 60 console.log("Running froomle_1 variant"); 61 window.froomle_ab_group = 'froomle_1'; 62 runFroomleWithGroup('froomle_1'); 63 } 64 65 // LOGIQUE GROUPE "froomle_2" (Froomle only) 66 function runFroomleFroomle2() { 67 console.log("Running froomle_2 variant"); 68 window.froomle_ab_group = 'froomle_2'; 69 runFroomleWithGroup('froomle_2'); 70 } 71 72 // Fonction générique pour exécuter la logique legacy en forçant le user_group 73 function runFroomleWithGroup(groupName) { 74 (async () => { 75 try { 76 if (typeof Drupal !== undefined && Drupal.settings.ena_froomle !== undefined && Drupal.settings.ena_froomle.enable !== undefined && Drupal.settings.ena_froomle.enable && Drupal.settings.ena_froomle.is_loaded_recom === undefined) { 77 Drupal.settings.ena_froomle.is_loaded_recom = true; 78 79 const deviceId = getDeviceId(); 80 const container = document.getElementById("r-froomle--reco"); 81 const containerArticle = document.querySelector(".r-froomle--article-reco"); 82 83 jwtToken = getCookie(Drupal.settings.ena_froomle.jwtTokenCookieName) 84 if (jwtToken != undefined && jwtToken !== "") { 85 jwtTokenSplit = jwtToken.split("."); 86 if (jwtTokenSplit[1] !== undefined) { 87 jwtTokenString = atob(jwtTokenSplit[1]); 88 jwtTokenObj = JSON.parse(jwtTokenString); 89 if (jwtTokenObj.loginID != undefined && jwtTokenObj.loginID != "" || jwtTokenObj.i != undefined && jwtTokenObj.i != "") { 90 loginId = ""; 91 if (jwtTokenObj.i != undefined && jwtTokenObj.i != "") { 92 loginId = jwtTokenObj.i; 93 } else { 94 loginId = jwtTokenObj.loginID; 95 } 96 if (dataLayer != undefined && dataLayer.find(e => e.event === "custom-didomi-loaded").vendors.froomle == true) { 97 const froomleApi = Drupal.settings.ena_froomle.apiUrl; 98 const fallbackSection = Drupal.settings.ena_froomle.section_fallback; 99 const list_name = window.froomleListName || "recommended_for_you"; 100 const regex_user_agent = /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i; 101 102 let articleHidden = document.querySelector("r-main > .r-viewmode--niveau-2:last-of-type"); 103 if (articleHidden !== null && articleHidden.length !== 0) { 104 articleHidden.style.display = "none"; 105 } 106 let user_subscription = "NONE"; 107 if (dataLayer != undefined && dataLayer[0] != undefined && dataLayer[0]['member_status_v2'] == "abonne") { 108 user_subscription = "SUBSCRIPTION"; 109 } 110 111 let excludes = [] 112 const article_to_exclude = document.querySelectorAll('.-is-targetblock
112i.r-m'); 113 article_to_exclude.forEach(function (i_article, index) { 114 if (i_article.getAttribute('data-extref') != "") { 115 excludes.push({ 116 id: i_article.getAttribute('data-extref'), 117 item_type: "article", 118 reconsumable: false 119 }); 120 } 121 }); 122 123 let page_type = Drupal.settings.ena_froomle.pageType; 124 125 const context = { 126 channel: regex_user_agent.test(navigator.userAgent) ? "www-mobile" : "www-desktop", 127 page_type: Drupal.settings.ena_froomle.pageType, 128 device_id: deviceId, 129 user_id: loginId, 130 user_subscription: user_subscription, 131 histories: {exclude: excludes}, 132 user_group: groupName // <-- on force le groupe pour l'AB test 133 }; 134 135 if (page_type == "article_detail") { 136 context.context_item = Drupal.settings.ena_froomle.extRef; 137 context.context_item_type = "article"; 138 } 139 140 let nbArticle = (containerArticle !== null && containerArticle.length !== 0) ? Drupal.settings.ena_froomle.nb_article + 1 : Drupal.settings.ena_froomle.nb_article; 141 let recommendations = await fetchRecommendations(froomleApi, context, [list_name], [nbArticle]); 142 // Ensure consistency for the AB test: force the user_group to the groupName 143 // so that URLs, dataLayer items and events all use the same group. 144 recommendations = recommendations || {}; 145 recommendations.user_group = groupName; 146 147 let recommended_items = recommendations.lists 148 .find(l => l.list_name === list_name) 149 .items; 150 let articles_rendered = ""; 151 152 if (recommended_items == undefined || recommended_items == "") { 153 let recommendationsFallback = await fetchFallbackSection(fallbackSection, context, [list_name], [nbArticle]); 154 let recommended_items_fallback = recommendationsFallback.packages; 155 for (const item of recommended_items_fallback) { 156 articles_rendered += `<r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2"> 157 ${item.rendered} 158 </r-viewmode>`; 159 } 160 } 161 else { 162 dataLayer.push({ 163 event: "select_item", 164 ecommerce: { 165 items: [] 166 } 167 }); 168 169 let indexFirstPaidItem = (recommended_items.findIndex(({access_type}) => access_type === "PAID") !== -1) ? recommended_items.findIndex(({access_type}) => access_type === "PAID") : 0; 170 let indexFirstFreeItem = (recommended_items.findIndex(({access_type}) => access_type === "FREE") !== -1) ? recommended_items.findIndex(({access_type}) => access_type === "FREE") : 0; 171 172 recommended_items.forEach(function (item, key) { 173 var image = ""; 174 if(item.images[0] == null) { 175 image = document.location.host + "/sites/all/themes/enacarbon_lesoir/images/default.svg"; 176 } else { 177 image = item.images[0]; 178 } 179 180 dataLayer.find(e => e.event === "select_item").ecommerce.items.push({ 181 item_id: item.item_id, 182 item_type: item.item_type, 183 request_id: recommendations.request_id, 184 user_group: recommendations.user_group, 185 item_list_name: recommendations.lists[0].list_name, 186 }); 187 188 const context2 = { 189 page_type: Drupal.settings.ena_froomle.pageType, 190 device_id: deviceId, 191 user_id: loginId, 192 list_name: recommendations.lists[0].list_name, 193 action_item: item.item_id, 194 request_id: recommendations.request_id, 195 channel: regex_user_agent.test(navigator.userAgent) ? "www-mobile" : "www-desktop", 196 user_group: recommendations.user_group 197 }; 198
199 impression(froomleApi, context2); // no await! 200 201 let iconAbo = ""; 202 if (item.access_type != undefined && item.access_type == "PAID" || item.item_attributes != undefined && item.item_attributes.restricted_access != undefined && item.item_attributes.restricted_access == true) { 203 iconAbo = `<r-icon class="r-icon--abonne"></r-icon>`; 204 } 205 206 if (containerArticle !== null && containerArticle.length !== 0) { 207 if (dataLayer[0]['member_status_v2'] == "abonne") { 208 if (key == indexFirstPaidItem) { 209 containerArticle.innerHTML = ` 210 <article> 211 <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link"> 212 <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure> 213 </a> 214 <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3> 215 </article> 216 `; 217 } 218 if (key !== indexFirstPaidItem) { 219 articles_rendered += ` 220 <r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2"> 221 <article> 222 <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link"> 223 <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure> 224 </a> 225 <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3> 226 </article> 227 </r-viewmode>`; 228 } 229 } else { 230 if (key == indexFirstFreeItem) { 231 containerArticle.innerHTML = ` 232 <article> 233 <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link"> 234 <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure> 235 </a> 236 <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3> 237 </article> 238 `; 239 } 240 if (key !== indexFirstFreeItem) { 241 articles_rendered += ` 242 <r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2"> 243 <article> 244 <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link"> 245 <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure> 246 </a> 247 <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3> 248 249 </article> 250 </r-viewmode> 251 `; 252 } 253 } 254 } else { 255 articles_rendered += ` 256 <r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2"> 257 <article> 258 <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link"> 259 <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure> 260 </a> 261 <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3> 262 263 </article> 264 </r-viewmode> 265 `; 266 } 267 }); 268 } 269 270 container.innerHTML = articles_rendered; 271 272 $('.r-froomle--link').click(function(event) { 273 try { 274 event.preventDefault(); 275 var url = $(this).attr('href'); 276 var parameters = getUrlParameters(url); 277 278 const context3 = { 279 page_type: Drupal.settings.ena_froomle.pageType, 280 device_id: deviceId, 281 user_id: loginId, 282 list_name: parameters.f_itemlistname, 283 action_item: parameters.f_itemid, 284 request_id: parameters.f_requestid, 285 channel: regex_user_agent.test(navigator.userAgent) ? "www-mobile" : "www-desktop", 286 user_group: parameters.f_usergroup 287 }; 288
289 clickRecommendation(froomleApi, context3) 290 .then(() => { 291 window.location.href = url; 292 }).catch(function(error) { 293 window.location.href = url; 294 }); 295 } catch (error) { 296 window.location.href = $(this).attr('href'); 297 } 298 }); 299 300 } else { 301 if (containerArticle !== null && containerArticle.length !== 0) { 302 containerArticle.style.display = "none"; 303 } 304 305 let cookiesText = Drupal.settings.ena_froomle.textCookies; 306 if (cookiesText == "" || cookiesText == undefined) { 307 cookiesText = `Pour profiter dâune expérience de lecture optimale,<br />nous vous conseillons dâactiver vos cookies.`; 308 } 309 310 container.innerHTML = ` 311 <r-panel class="r-froomle--cookies"> 312 <p>${cookiesText}</p> 313 <a onclick="showConsentPopup();" class="r-btn r-btn--primary">Activer</a> 314 </r-panel> 315 `; 316 } 317 } 318 } 319 } else { 320 if (containerArticle !== null && containerArticle.length !== 0) { 321 containerArticle.style.display = "none"; 322 } 323 324 let paywallText = Drupal.settings.ena_froomle.textPaywall; 325 if (paywallText == "" || paywallText == undefined) { 326 paywallText = `Découvrez une sélection d'articles qui correspondent à vos intérêts<br /> en vous inscrivant gratuitement`; 327 } 328 329 container.innerHTML = ` 330 <r-panel class="r-froomle--anonyme"> 331 <p>${paywallText}</p> 332 <a href="${Drupal.settings.ena_froomle.profilUrl}${window.location.href}" class="r-btn r-btn--primary r-froomle--register">Je m'inscris</a> 333 <a href="${Drupal.settings.ena_froomle.loginUrl}${window.location.href}" class="r-froomle--login">Je me connecte</a> 334 </r-panel> 335 `; 336 } 337 } 338 } catch (error) { 339 console.error('Error runFroomleWithGroup : ', error); 340 } 341 })(); 342 } 343 344 // fonction d'extraction paramètres de l'URL 345 function getUrlParameters(url) { 346 var params = {}; 347 var parser = document.createElement('a'); 348 parser.href = url; 349 var query = parser.search.substring(1); 350 var vars = query.split('&'); 351 352 for (var i = 0; i < vars.length; i++) { 353 var pair = vars[i].split('='); 354 params[pair[0]] = decodeURIComponent(pair[1]); 355 } 356 357 return params; 358 } 359 360 function getDeviceId() { 361 let deviceId = localStorage.getItem('deviceId'); 362 if (!deviceId) { 363 // Générer un UUID et le persister 364 deviceId = crypto.randomUUID(); 365 localStorage.setItem('deviceId', deviceId); 366 } 367 console.log(deviceId); 368 return deviceId; 369 } 370 371 // --- Début : Fonctions utilitaires rendues globales --- 372 async function fetchRecommendations(froomleApi, context, list_names, list_sizes) { 373 let data = JSON.stringify(Object.assign({ 374 lists: list_names.map((name, i) => ({ 375 list_name: name, 376 list_size: list_sizes[i] 377 })) 378 }, context)); 379 console.log(data); 380 // build headers and add X-User-Group when available 381 const headers = { 'Content-Type': 'application/json' }; 382 try { 383 if (typeof window !== 'undefined' && typeof window.froomle_ab_group === 'string' && window.froomle_ab_group !== '') { 384 headers['X-User-Group'] = window.froomle_ab_group; 385 } 386 } catch (e) { /* ignore */ } 387 388 const response = await fetch(`${froomleApi}/recommendations/requests`, { 389 method: 'POST', 390 headers: headers, 391 body: data, 392 }); 393 if (!response.ok) { 394 console.log("froomle error : " + response.statusText); 395 throw Error(response.statusText); 396 } 397 return await response.json(); 398 } 399 400 async function fetchFallbackSection(sectionId, context, list_names, list_sizes) { 401 const response = await fetch('/api/sectionrendered/apps/' + sectionId + '/cible_principale/0/4/enacarbon_teaser_panel.json', { 402 method: 'GET', 403 headers: { 404 'Content-Type': 'application/json' 405 }, 406 }); 407 if (!response.ok) { 408 throw Error(response.statusText); 409 } 410 return await response.json(); 411 } 412
413 function clickRecommendation(froomleApi, context) { 414 let data = JSON.stringify({ 415 events: [Object.assign({ 416 event_type: "click_on_recommendation", 417 action_item: context.action_item, 418 action_item_type: "article" 419 }, context)] 420 }); 421 console.log(data); 422 const headers = { 'Content-Type': 'application/json' }; 423 try { 424 if (typeof context.user_group === 'string' && context.user_group !== '') { 425 headers['X-User-Group'] = context.user_group; 426 } else if (typeof window !== 'undefined' && typeof window.froomle_ab_group === 'string' && window.froomle_ab_group !== '') { 427 headers['X-User-Group'] = window.froomle_ab_group; 428 } 429 } catch (e) { /* ignore */ } 430 431 return fetch(`${froomleApi}/events`, { 432 method: 'POST', 433 headers: headers, 434 body: data 435 }) 436 .then(response => { 437 if (!response.ok) { 438 throw Error(response.statusText); 439 } 440 return response.json(); 441 }); 442 } 443 444 async function impression(froomleApi, context) { 445 const headers = { 'Content-Type': 'application/json' }; 446 try { 447 if (typeof context.user_group === 'string' && context.user_group !== '') { 448 headers['X-User-Group'] = context.user_group; 449 } else if (typeof window !== 'undefined' && typeof window.froomle_ab_group === 'string' && window.froomle_ab_group !== '') { 450 headers['X-User-Group'] = window.froomle_ab_group; 451 } 452 } catch (e) { /* ignore */ } 453 454 const response = await fetch(`${froomleApi}/events`, { 455 method: 'POST', 456 headers: headers, 457 body: JSON.stringify({ 458 events: [Object.assign({ 459 event_type: "impression", 460 action_item: context.action_item, 461 action_item_type: "article" 462 }, context)] 463 }) 464 }); 465 if (!response.ok) { 466 throw Error(response.statusText); 467 } 468 return await response.json(); 469 } 470 // --- Fin : Fonctions utilitaires globales --- 471 472 function ena_froomle_recommendations() { 473 (async () => { 474 try { 475 if (typeof Drupal !== undefined && Drupal.settings.ena_froomle !== undefined && Drupal.settings.ena_froomle.enable !== undefined && Drupal.settings.ena_froomle.enable && Drupal.settings.ena_froomle.is_loaded_recom === undefined) { 476 // @TODO hack degueu, actuellement le script est appelé deux fois (comme, tous les autres script visiblement dans la page), on set une variable pour ne pas faire un second appel a froomle. 477 // @TODO se baser sur l'ID du block en plus si pas de solution propre 478 Drupal.settings.ena_froomle.is_loaded_recom = true; 479 480 const deviceId = getDeviceId(); 481 const container = document.getElementById("r-froomle--reco"); 482 const containerArticle = document.querySelector(".r-froomle--article-reco"); 483 484 jwtToken = getCookie(Drupal.settings.ena_froomle.jwtTokenCookieName) 485 if (jwtToken != undefined && jwtToken !== "") { 486 // Split the JWT token to parse them 487 jwtTokenSplit = jwtToken.split("."); 488 if (jwtTokenSplit[1] !== undefined) { 489 jwtTokenString = atob(jwtTokenSplit[1]); 490 // Convert the jwtToken to object 491 jwtTokenObj = JSON.parse(jwtTokenString); 492 493 // si la personne est connectée -> loginID est différent de undefined ou vide 494 if (jwtTokenObj.loginID != undefined && jwtTokenObj.loginID != "" || jwtTokenObj.i != undefined && jwtTokenObj.i != "") { 495 loginId = ""; 496 if (jwtTokenObj.i != undefined && jwtTokenObj.i != "") { 497 loginId = jwtTokenObj.i; 498 } else { 499 loginId = jwtTokenObj.loginID; 500 } 501 // si la personne a accepté le cookie froomle 502 if (dataLayer != undefined && dataLayer.find(e => e.event === "custom-didomi-loaded").vendors.froomle == true) { 503 const froomleApi = Drupal.settings.ena_froomle.apiUrl; 504 const fallbackSection = Drupal.settings.ena_froomle.section_fallback; 505 const list_name = "recommended_for_you"; 506 const regex_user_agent = /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i; 507 508 //let articleHidden = document.querySelector(".r-froomle--article-reco + .
508-is-targetblock"); // pour l'article juste à côté 509 //let articleHidden = document.querySelector("r-main > .-is-targetblock:last-of-type"); // le dernier article niveau 2 510 511 let articleHidden = document.querySelector("r-main > .r-viewmode--niveau-2:last-of-type"); // le dernier article niveau 2 512 513 if (articleHidden !== null && articleHidden.length !== 0) { 514 articleHidden.style.display = "none"; 515 } 516 let user_subscription = "NONE"; 517 if (dataLayer != undefined && dataLayer[0] != undefined && dataLayer[0]['member_status_v2'] == "abonne") { 518 // l'utilisteur est abonné 519 user_subscription = "SUBSCRIPTION"; 520 } 521 522 // exclure des recommendations les articles présents dans la page 523 let excludes = [] 524 const article_to_exclude = document.querySelectorAll('.-is-targetblock i.r-m'); 525 article_to_exclude.forEach(function (i_article, index) { 526 if (i_article.getAttribute('data-extref') != "") { 527 excludes.push({ 528 id: i_article.getAttribute('data-extref'), 529 item_type: "article", 530 reconsumable: false 531 }); 532 } 533 }); 534 535 let page_type = Drupal.settings.ena_froomle.pageType; 536 537 const context = { 538 channel: regex_user_agent.test(navigator.userAgent) ? "www-mobile" : "www-desktop", 539 page_type: Drupal.settings.ena_froomle.pageType, 540 device_id: deviceId, 541 user_id: loginId, 542 user_subscription: user_subscription, 543 histories: {exclude: excludes} 544 }; 545 546 if (page_type == "article_detail") { 547 // nécessaire pour page_type article_detail 548 context.context_item = Drupal.settings.ena_froomle.extRef; 549 context.context_item_type = "article"; 550 } 551 552 // si il y a le bloc avec 1 seul article, alors le nombre de d'article est celui paramétré dans le bloc froomle +1, sinon il reste à celui paramétré 553 let nbArticle = (containerArticle !== null && containerArticle.length !== 0) ? Drupal.settings.ena_froomle.nb_article + 1 : Drupal.settings.ena_froomle.nb_article; 554 let recommendations = await fetchRecommendations(froomleApi, context, [list_name], [nbArticle]); 555 let recommended_items = recommendations.lists 556 .find(l => l.list_name === list_name) 557 .items; 558 let articles_rendered = ""; 559 560 // pour si on n'a pas d'information de froomle on utilise la section renseigné dans l'admin froomle 561 if (recommended_items == undefined || recommended_items == "") { 562 console.log("Froomle - get recommendation from section"); 563 564 let recommendationsFallback = await fetchFallbackSection(fallbackSection, context, [list_name], [nbArticle]); 565 let recommended_items_fallback = recommendationsFallback.packages; 566 567 for (const item of recommended_items_fallback) { 568 articles_rendered += `<r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2"> 569 ${item.rendered} 570 </r-viewmode>`; 571 } 572 } 573 else { 574 console.log("Froomle - get recommendation from froomle"); 575 576 // initialisation du push du datalayer 577 dataLayer.push({ 578 event: "select_item", 579 ecommerce: { 580 items: [] 581 } 582 }); 583 584 // récupérer les index des articles payant/gratuit et un chiffre de fallback si il n'y en a pas 585 let indexFirstPaidItem = (recommended_items.findIndex(({access_type}) => access_type === "PAID") !== -1) ? recommended_items.findIndex(({access_type}) => access_type === "PAID") : 0; 586 let indexFirstFreeItem = (recommended_items.findIndex(({access_type}) => access_type === "FREE") !== -1) ? recommended_items.findIndex(({access_type}) => access_type === "FREE") : 0; 587 588 // parcourir les articles recommandés
589 recommended_items.forEach(function (item, key) { 590 591 592 var image = ""; 593 if(item.images[0] == null) { 594 image = document.location.host + "/sites/all/themes/enacarbon_lesoir/images/default.svg"; 595 } else { 596 image = item.images[0]; 597 } 598 599 // dataLayer 600 dataLayer.find(e => e.event === "select_item").ecommerce.items.push({ 601 item_id: item.item_id, 602 item_type: item.item_type, 603 request_id: recommendations.request_id, 604 user_group: recommendations.user_group, 605 item_list_name: recommendations.lists[0].list_name, // needs to match the list_name used in the recommendation response 606 }); 607 608 // une recommandation de Froomle qui a été montrée à l'utilisateur 609 const context = { 610 page_type: Drupal.settings.ena_froomle.pageType, 611 device_id: deviceId, 612 user_id: loginId, 613 list_name: recommendations.lists[0].list_name, 614 action_item: item.item_id, 615 request_id: recommendations.request_id, 616 channel: regex_user_agent.test(navigator.userAgent) ? "www-mobile" : "www-desktop", 617 user_group: recommendations.user_group 618 }; 619 620 const resp = impression(froomleApi, context); // no await! 621 622 // icône abonnement 623 let iconAbo = ""; 624 if (item.access_type != undefined && item.access_type == "PAID" || item.item_attributes != undefined && item.item_attributes.restricted_access != undefined && item.item_attributes.restricted_access == true) { 625 iconAbo = `<r-icon class="r-icon--abonne"></r-icon>`; 626 } 627 628 if (containerArticle !== null && containerArticle.length !== 0) { 629 // si l'utilisateur est abonné : 630 if (dataLayer[0]['member_status_v2'] == "abonne") { 631 // on affiche le 1er article payant en 7ème position 632 if (key == indexFirstPaidItem) { 633 containerArticle.innerHTML = ` 634 <article> 635 <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link"> 636 <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure> 637 </a> 638 <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3> 639 </article> 640 `; 641 } 642 // et on n'affiche pas le premier article payant dans le bloc froomle 643 if (key !== indexFirstPaidItem) { 644 articles_rendered += ` 645 <r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2"> 646 <article> 647 <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link"> 648 <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure> 649 </a> 650 <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3> 651 </article> 652 </r-viewmode>`; 653 } 654 } else { 655 // sinon l'utilisateur n'est pas abonné 656 // on affiche le premier article gratuit en 7ème position 657 if (key == indexFirstFreeItem) {
658 containerArticle.innerHTML = ` 659 <article> 660 <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link"> 661 <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure> 662 </a> 663 <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3> 664 </article> 665 `; 666 } 667 // et on n'affiche pas le premier article gratuit dans le bloc froomle 668 if (key !== indexFirstFreeItem) { 669 articles_rendered += ` 670 <r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2"> 671 <article> 672 <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link"> 673 <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure> 674 </a> 675 <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3> 676 677 </article> 678 </r-viewmode> 679 `; 680 } 681 } 682 } else { 683 articles_rendered += ` 684 <r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2"> 685 <article> 686 <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link"> 687 <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure> 688 </a> 689 <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3> 690 691 </article> 692 </r-viewmode> 693 `; 694 } 695 }); 696 } 697 698 container.innerHTML = articles_rendered; 699 700 // event listener clique sur un lien recommandé par Froomle pour leur envoyer les infos de l'article froomle visité 701 $('.r-froomle--link').click(function(event) { 702 console.log('click on froomle link'); 703 try { 704 event.preventDefault(); 705 var url = $(this).attr('href'); 706 var parameters = getUrlParameters(url); 707 708 const context = { 709 page_type: Drupal.settings.ena_froomle.pageType, 710 device_id: deviceId, 711 user_id: loginId, 712 list_name: parameters.f_itemlistname, 713 action_item: parameters.f_itemid, 714 request_id: parameters.f_requestid, 715 channel: regex_user_agent.test(navigator.userAgent) ? "www-mobile" : "www-desktop", 716 user_group: parameters.f_usergroup 717 }; 718
719 clickRecommendation(froomleApi, context) 720 .then(() => { 721 // rediriger l'utilisateur après l'appel API réussi 722 window.location.href = url; 723 }).catch(function(error) { 724 console.error('Error link ena_froomle_recommendations.js : ', error); 725 // rediriger l'utilisateur y compris en cas d'erreur lors de l'appel à l'API 726 window.location.href = url; 727 }); 728 } catch (error) { 729 console.error('Error link ena_froomle_recommendations.js: ', error); 730 // rediriger l'utilisateur en cas d'autre erreur 731 window.location.href = $(this).attr('href'); 732 } 733 }); 734 735 } else { 736 // il n'a pas accepté le cookie froomle 737 if (containerArticle !== null && containerArticle.length !== 0) { 738 containerArticle.style.display = "none"; 739 } 740 741 let cookiesText = Drupal.settings.ena_froomle.textCookies; 742 if (cookiesText == "" || cookiesText == undefined) { 743 cookiesText = `Pour profiter dâune expérience de lecture optimale,<br />nous vous conseillons dâactiver vos cookies.`; 744 } 745 746 container.innerHTML = ` 747 <r-panel class="r-froomle--cookies"> 748 <p>${cookiesText}</p> 749 <a onclick="showConsentPopup();" class="r-btn r-btn--primary">Activer</a> 750 </r-panel> 751 `; 752 } 753 } 754 } 755 } else { 756 // il n'est pas connecté 757 if (containerArticle !== null && containerArticle.length !== 0) { 758 containerArticle.style.display = "none"; 759 } 760 761 let paywallText = Drupal.settings.ena_froomle.textPaywall; 762 if (paywallText == "" || paywallText == undefined) { 763 paywallText = `Découvrez une sélection d'articles qui correspondent à vos intérêts<br /> en vous inscrivant gratuitement`; 764 } 765 766 container.innerHTML = ` 767 <r-panel class="r-froomle--anonyme"> 768 <p>${paywallText}</p> 769 <a href="${Drupal.settings.ena_froomle.profilUrl}${window.location.href}" class="r-btn r-btn--primary r-froomle--register">Je m'inscris</a> 770 <a href="${Drupal.settings.ena_froomle.loginUrl}${window.location.href}" class="r-froomle--login">Je me connecte</a> 771 </r-panel> 772 `; 773 } 774 } 775 } catch (error) { 776 console.error('Error ena_froomle_recommendations.js : ', error); 777 } 778 })(); 779 } 780 }); 781 })(jQuery); 782});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.