PageSourceSearch

https://casinosanalyzer.ca/build/midori/assets/js/adminPanel.js?t=

js casinosanalyzer.ca collected 2026-09-25 23:53:24 UTC 26,057 bytes, 637 lines download raw bytes

1const adminPanel = () => {
2    const body = document.querySelector(`body`),
3        header = document.querySelector(`.header`),
4        siteID = body.dataset.siteId,
5        pageID = body.dataset.pageId,
6        templateID = body.dataset.templateId,
7        routeID = body.dataset.routeId,
8        casinoID = body.dataset.casinoId,
9        slotID = body.dataset.slotId,
10        routeName = body.dataset.routeBonus;
11
12    body.classList.add(`admin`);
13
14    let domain = document.location.host,
15        currentURL = document.location.href;
16    const envs = [`loc`];
17    for (let i = 0; i < envs.length; i++) {
18        domain = domain.replace(`${envs[i]}.`, ``);
19        currentURL = currentURL.replace(`${envs[i]}.`, ``);
20    }
21
22    let domainWithoutHTTPS = domain.replace(`https://`, ``);
23    let currentURLWithoutHTTPS = currentURL.replace(`https://`, ``);
24
25    domain = encodeURIComponent(domain);
26    domainWithoutHTTPS = encodeURIComponent(domainWithoutHTTPS);
27    currentURL = encodeURIComponent(currentURL);
28    currentURLWithoutHTTPS = encodeURIComponent(currentURLWithoutHTTPS);
29
30    const panel = document.createElement(`div`);
31    panel.className = `adminPanel`;
32
33    const panelTitle = document.createElement(`div`);
34    panelTitle.className = `panelTitle`;
35
36    const panelMainBtn = document.createElement(`div`);
37    panelMainBtn.className = `panelMainBtn`;
38
39// hideAdminPanel
40    const hideAdminPanel = () => {
41        panel.classList.add(`hidden`);
42
43        let panelHeight = panel.offsetHeight;
44        panel.style.top = `-${panelHeight - 13}px`;
45
46        const isMobile = window.matchMedia(`(max-width: 576px)`).matches;
47        body.style.paddingTop = isMobile ? `72px` : `88px`;
48        header.style.top = 0;
49    }
50// hideAdminPanel
51
52// View Edit Content Quick Links
53    const staticContents = document.querySelectorAll(`div[data-admin-static-content]`);
54    const staticContentsSelection = checked => {
55        if (staticContents.length) {
56            staticContents.forEach(el => {
57                const btn = el.querySelector(`.contentSelectionLink`);
58                if (checked) {
59                    const staticContentId = el.dataset.staticContentId,
60                        staticType = el.dataset.staticType,
61                        staticPosition = el.dataset.staticPosition,
62                        staticPriority = el.dataset.staticPriority,
63                        btnParams = [];
64
65                    staticPosition && btnParams.push({title: `Position`, value: staticPosition});
66                    staticType && btnParams.push({title: `Type`, value: staticType});
67                    staticPriority && btnParams.push({title: `Priority`, value: staticPriority});
68
69                    el.classList.add(`contentSelection`);
70
71                    if (!btn) {
72                        const editLink = document.createElement(`a`);
73                        editLink.className = `contentSelectionLink`;
74                        editLink.innerText = `Edit Content`;
75                        if (btnParams.length) {
76                            editLink.innerText += ` (${btnParams.map(obj => `${obj.title}: ${obj.value}`).join(` | `)})`
77                        }
78
79                        editLink.href = `${getAdminUrl()}/admin/app/cms/site/${siteID}/route/${routeID}/page/${pageID}/staticcontent/${staticContentId}/edit`;
80                        editLink.target = `_blank`;
81
82                        el.append(editLink);
83                    } else {
84                        btn.style.display = `block`;
85                    }
86                } else {
87                    el.classList.remove(`contentSelection`);
88                    btn.style.display = `none`;
89                }
90            })
91        }
92    }
93// View Edit Content Quick Links
94
95// View Edit Widget Quick Links
96    const WidgetQuickLinksLabel = document.createElement(`label`);
97    WidgetQuickLinksLabel.className = `WidgetQuickLinksLabel`;
98    WidgetQuickLinksLabel.innerHTML = `View Edit Widget Quick Links`;
99
100    const WidgetQuickLinksInput = document.createElement(`input`);
101    WidgetQuickLinksInput.type = `checkbox`;
102    WidgetQuickLinksInput.checked = storage.getWidgetQuickLinks() ?
103        storage.getWidgetQuickLinks()
104        : false;
105
106    const WidgetIntentFitLabel = document.createElement(`label`);
107    WidgetIntentFitLabel.className = `WidgetIntentFitLabel`;
108    WidgetIntentFitLabel.innerHTML = `Intent Fit Log`;
109
110    const WidgetIntentFitInput = document.createElement(`input`);
111    WidgetIntentFitInput.type = `checkbox`;
112    WidgetIntentFitInput.checked = storage.getIntentFitLog() ?
113        storage.getIntentFitLog()
114        : false;
115
116    const widgets = document.querySelectorAll(`div[data-admin-widget]`);
117
118    const widgetQuickLinksSelection = checked => {
119        if (widgets.length) {
120            widgets.forEach(el => {
121                const btn = el.querySelector(`.widgetSelectionLink`);
122                if (checked) {
123                    const widgetId = el.dataset.widgetId,
124                        widgetPosition = el.dataset.widgetPosition,
125                        widgetHandler = el.dataset.widgetHandler,
126                        btnParams = [];
127
128                    widgetPosition && btnParams.push({title: `Position`, value: widgetPosition});
129                    widgetHandler && btnParams.push({title: `Handler`, value: widgetHandler});
130
131                    el.classList.add(`widgetSelection`);
132
133                    if (!btn) {
134                        const editLink = document.createElement(`a`);
135                        editLink.className = `widgetSelectionLink`;
136                        editLink.innerText = `Edit Widget`;
137                        if (btnParams.length) {
138                            editLink.innerText += ` (${btnParams.map(obj => `${obj.title}: ${obj.value}`).join(` | `)})`
139                        }
140                        editLink.href = `${getAdminUrl()}/admin/app/cms/site/${siteID}/route/${routeID}/template/${templateID}/widget/${widgetId}/edit`;
141                        editLink.target = `_blank`;
142
143                        el.append(editLink);
144                    } else {
145                        btn.style.display = `block`;
146                    }
147
148                } else {
149                    el.classList.remove(`widgetSelection`);
150                    btn.style.display = `none`;
151                }
152            })
153        }
154    }
155
156    const createBonusLabel = (bonusId) => {
157        const label = document.createElement('a');
158        label.className = 'widgetSelection_bonus-label';
159        label.target = '_blank';
160        label.href = `${getAdminUrl()}/admin/app/casino/newbonus/${bonusId}/edit`;
161        label.textContent = bonusId;
162
163        label.addEventListener('click', (event) => {
164            event.stopPropagation();
165        });
166
167        return label;
168    };
169
170    const appendBonusLabel = (element) => {
171        const bonusId = element.dataset.bonus ?? element.dataset.id;
172
173        if (!element.querySelector('.widgetSelection_bonus-label')) {
174            const label = createBonusLabel(bonusId);
175            element.appendChild(label);
176        }
177    };
178
179    const handleBonusWidgetLabel = (checked, cardSelector) => {
180        const bonusCards = document.querySelectorAll(cardSelector);
181
182        bonusCards.forEach(element => {
183            if (checked) {
184                appendBonusLabel(element);
185            } else {
186                const label = element.querySelector('.widgetSelection_bonus-label');
187                if (label) label.remove();
188            }
189        });
190    };
191
192    const appendRewardWidgetLabel = (checked) => {
193        handleBonusWidgetLabel(
194            checked,
195            '.bonus__card',
196            '.bonus__card .widgetSelection_bonus-label'
197        );
198    };
199
200    const appendBonusWidgetLabel = (checked) => {
201        handleBonusWidgetLabel(
202            checked,
203            '[data-element="bonus_table_row"]',
204            '.table_cards-card .widgetSelection_bonus-label'
205        );
206    };
207
208    const appendBonusEEATWidgetLabel = (checked) => {
209        handleBonusWidgetLabel(
210          checked,
211          '[data-element="bonus-card"]',
212          '.bonus-card .widgetSelection_bonus-label'
213        );
214    };
215
216    const appendBonusWelcomeWidgetLabel = (checked) => {
217        handleBonusWidgetLabel(
218            checked,
219            '.bonusWelcomeTypeWidget__card',
220            '.bonusWelcomeTypeWidget__card .widgetSelection_bonus-label'
221        );
222    };
223
224    const appendBonusWelcomeDark3DWidgetLabel = (checked) => {
225        handleBonusWidgetLabel(
226          checked,
227          '.bonusWelcomeTypeDark3DWidget__card',
228          '.bonusWelcomeTypeDark3DWidget__card .widgetSelection_bonus-label'
229        );
230    };
231
232    const appendBonusWelcomeTncWidgetLabel = (checked) => {
233        handleBonusWidgetLabel(
234            checked,
235            '.bonusWelcomeTypeTncWidget__card',
236            '.bonusWelcomeTypeTncWidget__card .widgetSelection_bonus-label'
237        );
238    };
239
240    const appendBonusRestrictedWidgetLabel = (checked) => {
241        handleBonusWidgetLabel(
242            checked,
243            '.restrictedBlock__card',
244            '.restrictedBlock__card .widgetSelection_bonus-label'
245        );
246    };
247
248    const appendBonusStickyWidgetLabel = (checked) => {
249        handleBonusWidgetLabel(
250            checked,
251            '.stickyWidget__card',
252            '.stickyWidget__card .widgetSelection_bonus-label'
253        );
254    };
255
256    const appendHotOfferWidgetLabel = (checked) => {
257        handleBonusWidgetLabel(
258            checked,
259            '.hotBonuses__bonus',
260            '.hotBonuses__bonus .widgetSelection_bonus-label'
261        );
262    };
263
264    if (WidgetQuickLinksInput.checked) {
265        widgetQuickLinksSelection(true);
266        staticContentsSelection(true);
267        appendBonusWidgetLabel(true);
268        appendBonusEEATWidgetLabel(true);
269        appendBonusWelcomeWidgetLabel(true);
270        appendBonusWelcomeDark3DWidgetLabel(true);
271        appendBonusWelcomeTncWidgetLabel(true);
272        appendBonusRestrictedWidgetLabel(true);
273        appendBonusStickyWidgetLabel(true);
274        appendHotOfferWidgetLabel(true);
275        appendRewardWidgetLabel(true);
276    }
277
278    if (WidgetIntentFitLabel.checked) {
279        appendIntentFitInfoHTML(false);
280        appendIntentFitTagsHTML(false);
281    }
282
283    WidgetQuickLinksInput.addEventListener(`change`, e => {
284        storage.setWidgetQuickLinks(e.target.checked);
285
286        widgetQuickLinksSelection(e.target.checked);
287        staticContentsSelection(e.target.checked);
288        appendBonusWidgetLabel(e.target.checked);
289        appendBonusEEATWidgetLabel(e.target.checked);
290        appendBonusWelcomeWidgetLabel(e.target.checked);
291        appendBonusWelcomeDark3DWidgetLabel(e.target.checked);
292        appendBonusWelcomeTncWidgetLabel(e.target.checked);
293        appendBonusRestrictedWidgetLabel(e.target.checked);
294        appendBonusStickyWidgetLabel(e.target.checked);
295        appendHotOfferWidgetLabel(e.target.checked);
296        appendRewardWidgetLabel(e.target.checked);
297
298        if (storage.getIntentFitLog()) {
299            appendIntentFitTagsHTML(true);
300        }
301    });
302
303    WidgetIntentFitInput.addEventListener(`change`, e => {
304        appendIntentFitInfoHTML(e.target.checked);
305        appendIntentFitTagsHTML(e.target.checked);
306        storage.setIntentFitLog(e.target.checked);
307    });
308
309    if (storage.getIntentFitLog()) {
310        appendIntentFitInfoHTML(true);
311        appendIntentFitTagsHTML(true);
312    }
313
314    WidgetQuickLinksLabel.append(WidgetQuickLinksInput);
315    WidgetIntentFitLabel.append(WidgetIntentFitInput);
316// View Edit Widget Quick Links
317
318// View Widgets
319    const ViewWidgets = document.createElement(`a`);
320    ViewWidgets.innerHTML = `View Widgets`;
321    ViewWidgets.href = `${getAdminUrl()}/admin/app/cms/site/${siteID}/route/${routeID}/template/${templateID}/widget/list`;
322    ViewWidgets.target = `_blank`;
323// View Widgets
324
325// View Static Content
326    const ViewStaticContent = document.createElement(`a`);
327    ViewStaticContent.innerHTML = `View Static Content`;
328    ViewStaticContent.href = `${getAdminUrl()}/admin/app/cms/site/${siteID}/route/${routeID}/page/${pageID}/staticcontent/list`;
329    ViewStaticContent.target = `_blank`;
330// View Static Content
331
332// View Templates
333    const ViewTemplates = document.createElement(`a`);
334    ViewTemplates.innerHTML = `View Templates`;
335    ViewTemplates.href = `${getAdminUrl()}/admin/app/cms/site/${siteID}/route/${routeID}/template/list`;
336    ViewTemplates.target = `_blank`;
337// View Templates
338
339// Edit Page
340    const EditPage = document.createElement(`a`);
341    EditPage.innerHTML = `Edit Page`;
342    EditPage.href = `${getAdminUrl()}/admin/app/cms/site/${siteID}/route/${routeID}/page/${pageID}/edit`;
343    EditPage.target = `_blank`;
344// Edit Page
345
346// Edit Route
347    const EditRoute = document.createElement(`a`);
348    EditRoute.innerHTML = `Edit Route`;
349    EditRoute.href = `${getAdminUrl()}/admin/app/cms/site/${siteID}/route/${routeID}/edit`;
350    EditRoute.target = `_blank`;
351// Edit Route
352
353    panelMainBtn.append(
354        WidgetQuickLinksLabel,
355        WidgetIntentFitLabel,
356        ViewWidgets,
357        ViewStaticContent,
358        ViewTemplates,
359        EditPage,
360        EditRoute
361    );
362
363// Google btns
364    const pageAnalysis = document.createElement(`a`);
365    pageAnalysis.href = `https://search.google.com/search-console/performance/search-analytics?resource_id=sc-domain%3A${domain}&breakdown=query&page=!${currentURL}`;
366    pageAnalysis.target = `_blank`;
367    pageAnalysis.innerHTML = `<img alt="GSC" title="GSC" src="/build/midori/img/google-search-console.png" loading="lazy" width="25" height="25">`;
368
369    const ahrefsPageOverview = document.createElement(`a`);
370    ahrefsPageOverview.href = `https://app.ahrefs.com/v2-site-explorer/overview/exact?target=${currentURL}`;
371    ahrefsPageOverview.target = `_blank`;
372    ahrefsPageOverview.innerHTML = `<img alt="Ahrefs Page Overview" title="Ahrefs Page Overview" src="/build/midori/img/ahrefsPageOverview.png" loading="lazy" width="25" height="25">`;
373
374    const ahrefsPageBacklinks = document.createElement(`a`);
375    ahrefsPageBacklinks.href = `https://app.ahrefs.com/v2-site-explorer/backlinks/exact?grouping=group-sim
375ilar&target=${currentURL}`;
376    ahrefsPageBacklinks.target = `_blank`;
377    ahrefsPageBacklinks.innerHTML = `<img alt="Ahrefs Page Backlinks" title="Ahrefs Page Backlinks" src="/build/midori/img/ahrefsPageBacklinks.png" loading="lazy" width="25" height="25">`;
378
379    const googleCachePage = document.createElement(`a`);
380    googleCachePage.href = `http://webcache.googleusercontent.com/search?q=cache:${currentURLWithoutHTTPS}&strip=1&vwsrc=0`;
381    googleCachePage.target = `_blank`;
382    googleCachePage.innerHTML = `<img alt="Google Cache Page" title="Google Cache Page" src="/build/midori/img/googleCachePage.png" loading="lazy" width="25" height="25">`;
383
384    const googlePageSpeedInsightsPage = document.createElement(`a`);
385    googlePageSpeedInsightsPage.href = `https://pagespeed.web.dev/report?url=${currentURLWithoutHTTPS}`;
386    googlePageSpeedInsightsPage.target = `_blank`;
387    googlePageSpeedInsightsPage.innerHTML = `<img alt="Google PageSpeed Insights Page" title="Google PageSpeed Insights Page" src="/build/midori/img/googlePageSpeedInsightsPage.png" loading="lazy" width="25" height="25">`;
388
389    const googleMobileFriendlyTestPage = document.createElement(`a`);
390    googleMobileFriendlyTestPage.href = `https://search.google.com/test/mobile-friendly?url=${currentURLWithoutHTTPS}`;
391    googleMobileFriendlyTestPage.target = `_blank`;
392    googleMobileFriendlyTestPage.innerHTML = `<img alt="Google Mobile-Friendly Test Page" title="Google Mobile-Friendly Test Page" src="/build/midori/img/googleMobileFriendlyTestPage.png" loading="lazy" width="25" height="25">`;
393
394    const googleRichResultsTestPage = document.createElement(`a`);
395    googleRichResultsTestPage.href = `https://search.google.com/test/rich-results?url=${currentURLWithoutHTTPS}`;
396    googleRichResultsTestPage.target = `_blank`;
397    googleRichResultsTestPage.innerHTML = `<img alt="Google Rich Results Test Page" title="Google Rich Results Test Page" src="/build/midori/img/googleRichResultsTestPage.png" loading="lazy" width="25" height="25">`;
398
399    const schemaOrgValidatorPage = document.createElement(`a`);
400    schemaOrgValidatorPage.href = `https://validator.schema.org/#url=${currentURLWithoutHTTPS}`;
401    schemaOrgValidatorPage.target = `_blank`;
402    schemaOrgValidatorPage.innerHTML = `<img alt="Schema.Org Validator Page" title="Schema.Org Validator Page" src="/build/midori/img/schemaOrgValidatorPage.png" loading="lazy" width="25" height="25">`;
403
404    const btnsContainer = document.createElement(`div`);
405    btnsContainer.className = `btns__container`;
406    btnsContainer.append(pageAnalysis, ahrefsPageOverview, ahrefsPageBacklinks, googleCachePage, googlePageSpeedInsightsPage, googleMobileFriendlyTestPage, googleRichResultsTestPage, schemaOrgValidatorPage);
407// Google btns
408
409// Additional route btns
410    switch (routeName) {
411        case `p_bonus_casino`:
412            const ViewCasinoBonuses = document.createElement(`a`);
413            ViewCasinoBonuses.className = `additional`;
414            ViewCasinoBonuses.innerHTML = `View Casino Bonuses`;
415            ViewCasinoBonuses.href = `${getAdminUrl()}/admin/app/casino/newbonus/list?filter${encodeURIComponent(`[casino][value]`)}=${encodeURIComponent(casinoID)}`;
416            ViewCasinoBonuses.target = `_blank`;
417
418            const EditCasinoInfo = document.createElement(`a`);
419            EditCasinoInfo.className = `additional`;
420            EditCasinoInfo.innerHTML = `Edit Casino Info`;
421            EditCasinoInfo.href = `${getAdminUrl()}/admin/app/casino/casino/${casinoID}/edit`;
422            EditCasinoInfo.target = `_blank`;
423
424            panelMainBtn.append(ViewCasinoBonuses, EditCasinoInfo);
425            break;
426        case `p_casino`:
427            const ViewCasinoBonusesCasino = document.createElement(`a`);
428            ViewCasinoBonusesCasino.className = `additional`;
429            ViewCasinoBonusesCasino.innerHTML = `View Casino Bonuses`;
430            ViewCasinoBonusesCasino.href = `${getAdminUrl()}/admin/app/casino/newbonus/list?filter${encodeURIComponent(`[casino][value]`)}=${encodeURIComponent(casinoID)}`;
431            ViewCasinoBonusesCasino.target = `_blank`;
432
433            const EditCasinoInfoCasino = document.createElement(`a`);
434            EditCasinoInfoCasino.className = `additional`;
435            EditCasinoInfoCasino.innerHTML = `Edit Casino Info`;
436            EditCasinoInfoCasino.href = `${getAdminUrl()}/admin/app/casino/casino/${casinoID}/edit`;
437            EditCasinoInfoCasino.target = `_blank`;
438
439            panelMainBtn.append(ViewCasinoBonusesCasino, EditCasinoInfoCasino);
440            break;
441        case `p_slot`:
442            const EditSlotInfo = document.createElement(`a`);
443            EditSlotInfo.className = `additional`;
444            EditSlotInfo.innerHTML = `Edit Slot Info`;
445            EditSlotInfo.href = `${getAdminUrl()}/admin/app/casino/slot/${slotID}/edit`;
446            EditSlotInfo.target = `_blank`;
447
448            panelMainBtn.append(EditSlotInfo);
449            break;
450    }
451// Additional route btns
452
453// Hide Panel
454    const HidePanel = document.createElement(`button`);
455    HidePanel.innerHTML = `Hide Panel`;
456    HidePanel.className = "hidePanel"
457    HidePanel.addEventListener(`click`, () => {
458        storage.setAdminPanelHidden(true);
459        hideAdminPanel();
460    });
461// Hide Panel
462
463    panelMainBtn.append(HidePanel);
464
465    const titleInfo = document.createElement(`span`);
466    titleInfo.innerHTML = `<b>Title:</b> ${document.title}`;
467
468    panelTitle.append(titleInfo, btnsContainer);
469    panel.append(panelTitle, panelMainBtn);
470
471// Panel Show Btn
472    const panelShowBtn = document.createElement(`button`);
473    panelShowBtn.className = `panelShowBtn`;
474    panelShowBtn.addEventListener(`click`, () => {
475        panel.classList.remove(`hidden`);
476
477        let panelHeight = panel.offsetHeight;
478        panel.style.top = 0;
479        body.style.paddingTop = `${header.offsetHeight + panelHeight}px`;
480        header.style.top = `${panelHeight}px`;
481
482        storage.removeAdminPanelHidden();
483    })
484
485    panel.append(panelShowBtn);
486// Panel Show Btn
487
488    body.prepend(panel);
489
490// setPanelHeight
491    const setPanelHeight = () => {
492        let panelHeight = panel.offsetHeight;
493        body.style.paddingTop = `${header.offsetHeight + panelHeight}px`;
494        header.style.top = `${panelHeight}px`;
495    }
496// setPanelHeight
497
498    setPanelHeight();
499    window.addEventListener(`resize`, () => {
500        setPanelHeight();
501        storage.getAdminPanelHidden() && hideAdminPanel();
502    })
503    storage.getAdminPanelHidden() && hideAdminPanel();
504}
505
506const appendIntentFitInfoHTML = (checked) => {
507    const bonusCard = document.querySelectorAll('[data-element="bonus_table_row"],[data-element="bonus-card"]');
508    const bonusIntentFitItem = document.querySelectorAll('.card-td-intent-fit');
509
510    bonusCard.forEach(element => {
511        let changedElement = element.querySelector('.card-td-btn') || element.querySelector('.td__content--btn') || element.querySelector(`.tableModern__expired`) || element.querySelector(`.promoCard__img-wrapper`) || element.querySelector(`[data-element="bonus_terms-btn"]`);
512
513        const bonusEEAT = element.dataset.element === "bonus-card";
514
515        if (checked) {
516            if (!element.querySelector('.card-td-intent-fit')) {
517                const rawTags = element.dataset.tags;
518
519                let tags = [];
520
521                const parsed = JSON.parse(rawTags || '[]');
522
523                if (Array.isArray(parsed)) {
524                    tags = parsed;
525                }
526
527                const tagsHtml = tags.map(tag => {
528                    return `
529                        <tr>
530                            <td class="test">${tag.weight}</td>
531                            <td>${tag.tag_name}</td>
532                        </tr>
533                    `;
534                }).join('');
535
536                const intentTable = `<table class="intent-fit_table card-td-intent-fit">
537                        <tbody>
538                            <tr>
539                                <td class="item">casino geo score:</td>
540                                <td>${element.dataset['casino_geo_rating'] || 0}</td>
541                            </tr>
542                            <tr>
543                                <td class="item">bonus score:</td>
544                                <td>${element.dataset['bonusScore'] || 0}</td>
545                            </tr>
546                            <tr>
547                                <td class="item">bonus generosity:</td>
548                                <td>${element.dataset['bonusGenerosity'] || 0}</td>
549                            </tr>
550                            <tr>
551                                <td class="item">brand score:</td>
552                                <td>${element.dataset['brandScore'] || 0}</td>
553                            </tr>
554                            <tr>
555                                <td class="item">newness:</td>
556                                <td>${element.dataset['newness'] || 0}</td>
557                            </tr>
558                            <tr>
559                                <td class="item">tags:</td>
560                                <td>
561                                    <table>
562                                        ${tagsHtml}
563                                    </table>
564                                </td>
565                            </tr>
566                            <tr>
567                                <td class="item">INTENT FIT:</td>
568                                <td>${element.dataset['intentFit'] || 0}</td>
569                            </tr>
570                            <tr>
571                                <td class="item">SUMATOR:</td>
572                                <td>${element.dataset['summator'] || 0}</td>
573                            </tr>
574                        </tbody>
575                    </table>`;
576
577                const html = bonusEEAT ? `<div class="card-td-intent-fit">${intentTable}</div>` : `<td class="card-td-intent-fit">${intentTable}</td>`;
578
579                changedElement?.insertAdjacentHTML('afterend', html);
580            }
581
582            bonusIntentFitItem.forEach(el => {
583                el.style.display = 'block';
584            });
585
586            changedElement ? changedElement.style.display = 'none' : null;
587        } else {
588            changedElement ? changedElement.style.display = 'block' : null;
589
590            bonusIntentFitItem.forEach(el => {
591                el.style.display = 'none';
592            });
593        }
594    });
595}
596
597const appendIntentFitTagsHTML = (checked) => {
598    const bonusCard = document.querySelectorAll('[data-element="bonus_table_row"],[data-element="bonus-card"]');
599
600    bonusCard.forEach(element => {
601        if (checked) {
602            const label = document.createElement('a');
603            label.className = 'widgetSelection_bonus-tags';
604            label.target = '_blank';
605            label.href = `${getAdminUrl()}/admin/app/casino/newbonus/${element.dataset['bonus']}/edit?intent_tab=true`;
606            label.textContent = 'Tags';
607
608            label.addEventListener('click', (event) => {
609                event.stopPropagation();
610            });
611
612            element.append(label);
613        } else {
614            const tagLabels = document.querySelectorAll('.widgetSelection_bonus-tags');
615
616            tagLabels ? tagLabels.forEach(element => {
617                element.style.display = 'none';
618            }) : null;
619        }
620    });
621}
622
623const getAdminUrl = () => {
624    const envPrefixes = ['loc', 'sandbox', 'preprod', 'stage\\d+'];
625    const hostname = window.location.hostname;
626
627    const envPrefixRegex = new RegExp(`^(${envPrefixes.join('|')})\\.`,'i');
628    const isEnvPrefix = envPrefixRegex.test(hostname);
629
630    return isEnvPrefix ? window.location.origin : 'https://admin.casinosanalyzer.com';
631}
632export {
633    adminPanel,
634    appendIntentFitInfoHTML,
635    appendIntentFitTagsHTML,
636    getAdminUrl
637}

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.