packages feed

ihp-ide-1.4.0: data/static/IDE/data-hovercard.js

$(document).on('ready turbolinks:load', function () {
    initDataHoverCard();
});

function initDataHoverCard() {
    $('td[data-foreign-key-column]').each(function () {
        var element = this;

        $(element).tooltip({
            title: "Loading",
            html: true,
            placement: 'left',
            template: '<div class="tooltip foreign-key-hovercard" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',
            boundary: 'window'
        });

        var hoverCard = null;

        // When the `_id` column doesn't have a foreign key constraint
        // E.g. it's a stripe_customer_id column, then we get a 404 error
        // by the server. In that case we just dispose the tooltip in `updateConte`
        var isError = false;

        function updateContent() {
            const tooltipId = element.getAttribute('aria-describedby');
            const tooltipEl = document.getElementById(tooltipId);

            if (!tooltipEl) {
                return;
            }
            if (isError) {
                $(element).tooltip('dispose');
                return;
            }
            const tooltipInner = tooltipEl.querySelector('.tooltip-inner');

            tooltipInner.innerHTML = hoverCard;

            $(element).attr('title', hoverCard)
            $(element).tooltip('update');
            $(element).tooltip('_fixTitle');
        }

        $(element).on('show.bs.tooltip', async function () {
            var url = element.dataset.foreignKeyColumn;
            if (!hoverCard) {
                hoverCard = fetch(url, { credentials: 'include' }).then(res => {
                    if (!res.ok) {
                        console.log('ERROR');
                        isError = true;
                        return;
                    }
                    return res.text();
                });
                hoverCard = await hoverCard;

                updateContent();
            }
        });
        $(element).on('shown.bs.tooltip', async function () {
            if (!(hoverCard instanceof Promise) && !element.getAttribute('title')) {
                updateContent();
            }
        })
    })
}