MediaWiki:Common.js: Difference between revisions

From Doc-Wiki
Jump to navigation Jump to search
Fixed YouTube playlists gallery thumbnail handling
Added support for Simple Nursing Videos category gallery
 
(9 intermediate revisions by the same user not shown)
Line 2: Line 2:




/* YouTube Playlists Gallery Enhancement - Updated */
 
 
 
 
 
 
 
 
 
 
/* Level Up RN, Nursing.com & Simple Nursing - Video Galleries and Embeds */
(function() {
(function() {
     'use strict';
     'use strict';
    // Only run on Level Up RN category page
    if (mw.config.get('wgPageName') !== 'Category:Level_Up_RN') return;


     mw.loader.using(['jquery'], function() {
     mw.loader.using(['jquery'], function() {
         $(document).ready(function() {
         $(document).ready(function() {
            // Find the playlists table and transform it
            var $table = $('.wikitable.sortable').first();
            if (!$table.length) return;


             var $gallery = $('<div class="playlists-gallery"></div>');
             // Create working iframe embeds for individual video pages
            $('.youtube-video-embed[data-video-id]').each(function() {
                var $container = $(this);
                var videoId = $container.attr('data-video-id');


            $table.find('tr').each(function(index) {
                if (videoId) {
                if (index === 0) return; // Skip header
                    var iframe = $('<iframe>')
                        .attr({
                            'src': 'https://www.youtube.com/embed/' + videoId,
                            'frameborder': '0',
                            'allow': 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share',
                            'allowfullscreen': '',
                            'referrerpolicy': 'strict-origin-when-cross-origin'
                        })
                        .css({
                            'position': 'absolute',
                            'top': '0',
                            'left': '0',
                            'width': '100%',
                            'height': '100%'
                        });


                var $row = $(this);
                    $container.empty().append(iframe);
                 var $cells = $row.find('td');
                 }
            });


                 if ($cells.length < 3) return;
            // Transform playlist videos container into gallery
            $('.playlist-videos-container').each(function() {
                 var $container = $(this);
                var $gallery = $('<div class="video-cards-gallery"></div>');


                 var $titleCell = $cells.eq(0);
                 $container.find('.video-item').each(function() {
                var $descCell = $cells.eq(1);
                    var $item = $(this);
                    var videoId = $item.attr('data-video-id');
                    var pageUrl = $item.attr('data-page-url');
                    var videoTitle = $item.attr('data-title');


                var $titleLink = $titleCell.find('a').first();
                    if (!videoId || !pageUrl || !videoTitle) return;
                var playlistUrl = $titleLink.attr('href');
                var title = $titleLink.text();
                var description = $descCell.text().trim();


                if (!playlistUrl) return;
                    var $card = $('<div class="video-card"></div>');


                // Extract playlist ID from URL
                    var $thumb = $('<div class="video-card-thumb"></div>');
                var match = playlistUrl.match(/list=([^&]+)/);
                    var $thumbLink = $('<a></a>').attr('href', pageUrl);
                if (!match) return;
                var playlistId = match[1];


                // Use playlist thumbnail - YouTube provides these
                    var $thumbImg = $('<img>')
                var thumbUrl = 'https://i.ytimg.com/vi/' + playlistId + '/hqdefault.jpg';
                        .attr('src', 'https://i.ytimg.com/vi/' + videoId + '/hqdefault.jpg')
                        .attr('alt', videoTitle)
                        .css({
                            'width': '100%',
                            'height': '100%',
                            'object-fit': 'cover'
                        });


                // Try maxresdefault first, fall back to hqdefault
                    var $playButton = $('<div class="video-card-play">▶</div>');
                var $img = $('<img>').attr({
 
                     'src': 'https://i.ytimg.com/vi/' + playlistId + '/maxresdefault.jpg',
                    $thumbLink.append($thumbImg).append($playButton);
                    'alt': title,
                    $thumb.append($thumbLink);
                     'onerror': "this.onerror=null; this.src='https://i.ytimg.com/vi/" + playlistId + "/hqdefault.jpg'"
 
                     var $info = $('<div class="video-card-info"></div>');
                    var $titleLink = $('<a></a>')
                        .attr('href', pageUrl)
                        .text(videoTitle);
                     $info.append($titleLink);
 
                    $card.append($thumb).append($info);
                    $gallery.append($card);
                 });
                 });


                 var $box = $('<div class="playlist-box"></div>');
                 if ($gallery.children().length > 0) {
                var $thumb = $('<div class="playlist-box-thumb"></div>');
                    $container.replaceWith($gallery);
                var $thumbLink = $('<a></a>').attr({
                }
                    'href': playlistUrl,
            });
                    'target': '_blank'
 
                });
            // Transform category page playlist gallery (works for all nursing categories)
            var pageName = mw.config.get('wgPageName');
            if (pageName === 'Category:Level_Up_RN_Videos' ||
                pageName === 'Category:Level_Up_RN' ||
                pageName === 'Category:Nursing.com_Videos' ||
                pageName === 'Category:Simple_Nursing_Videos') {
 
                var $table = $('.wikitable.sortable').first();
                if (!$table.length) return;
 
                var $gallery = $('<div class="playlists-gallery"></div>');
 
                $table.find('tr').each(function(index) {
                    if (index === 0) return;
 
                    var $row = $(this);
                    var $cells = $row.find('td');
                    if ($cells.length < 3) return;
 
                    var $titleCell = $cells.eq(0);
                    var $descCell = $cells.eq(1);
 
                    var playlistId = $titleCell.attr('data-playlist-id');
                    var $titleLink = $titleCell.find('a').first();
                    var wikiPageUrl = $titleLink.attr('href');
                    var title = $titleLink.text();
                    var description = $descCell.text().trim();
 
                    if (!playlistId || !wikiPageUrl) return;
 
                    var $box = $('<div class="playlist-box"></div>');
 
                    // Make the entire box clickable
                    $box.css('cursor', 'pointer').on('click', function(e) {
                        if (!$(e.target).is('a')) {
                            window.location.href = wikiPageUrl;
                        }
                    });
 
                    var $thumb = $('<div class="playlist-box-thumb"></div>');
 
                    // Use YouTube iframe for thumbnail with pointer-events: none
                    var $thumbFrame = $('<iframe>')
                        .attr({
                            'src': 'https://www.youtube.com/embed/videoseries?list=' + playlistId + '&controls=0&showinfo=0&rel=0&modestbranding=1',
                            'frameborder': '0',
                            'loading': 'lazy'
                        })
                        .css({
                            'position': 'absolute',
                            'top': '0',
                            'left': '0',
                            'width': '100%',
                            'height': '100%',
                            'pointer-events': 'none'
                        });


                $thumbLink.append($img);
                    $thumb.append($thumbFrame);
                $thumbLink.append('<div class="playlist-box-overlay">▶ Playlist</div>');
                    $thumb.append('<div class="playlist-box-overlay">▶ Playlist</div>');
                $thumb.append($thumbLink);


                var $info = $('<div class="playlist-box-info"></div>');
                    var $info = $('<div class="playlist-box-info"></div>');
                $info.append('<div class="playlist-box-title">' + title + '</div>');
                    $info.append('<div class="playlist-box-title">' + title + '</div>');
                if (description) {
                    if (description) {
                    $info.append('<div style="margin: 8px 0; font-size: 13px; color: #666;">' + description + '</div>');
                        $info.append('<div style="margin: 8px 0; font-size: 13px; color: #666;">' + description + '</div>');
                }
                    }
                $info.append('<a href="' + playlistUrl + '" target="_blank" class="playlist-box-link">Watch Playlist →</a>');
                    $info.append('<a href="' + wikiPageUrl + '" class="playlist-box-link" onclick="event.stopPropagation();">Watch Playlist →</a>');


                $box.append($thumb).append($info);
                    $box.append($thumb).append($info);
                $gallery.append($box);
                    $gallery.append($box);
            });
                });


            if ($gallery.children().length > 0) {
                if ($gallery.children().length > 0) {
                $table.replaceWith($gallery);
                    $table.replaceWith($gallery);
                }
             }
             }
         });
         });
     });
     });
})();
})();

Latest revision as of 21:54, 17 January 2026

/* Any JavaScript here will be loaded for all users on every page load. */












/* Level Up RN, Nursing.com & Simple Nursing - Video Galleries and Embeds */
(function() {
    'use strict';

    mw.loader.using(['jquery'], function() {
        $(document).ready(function() {

            // Create working iframe embeds for individual video pages
            $('.youtube-video-embed[data-video-id]').each(function() {
                var $container = $(this);
                var videoId = $container.attr('data-video-id');

                if (videoId) {
                    var iframe = $('<iframe>')
                        .attr({
                            'src': 'https://www.youtube.com/embed/' + videoId,
                            'frameborder': '0',
                            'allow': 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share',
                            'allowfullscreen': '',
                            'referrerpolicy': 'strict-origin-when-cross-origin'
                        })
                        .css({
                            'position': 'absolute',
                            'top': '0',
                            'left': '0',
                            'width': '100%',
                            'height': '100%'
                        });

                    $container.empty().append(iframe);
                }
            });

            // Transform playlist videos container into gallery
            $('.playlist-videos-container').each(function() {
                var $container = $(this);
                var $gallery = $('<div class="video-cards-gallery"></div>');

                $container.find('.video-item').each(function() {
                    var $item = $(this);
                    var videoId = $item.attr('data-video-id');
                    var pageUrl = $item.attr('data-page-url');
                    var videoTitle = $item.attr('data-title');

                    if (!videoId || !pageUrl || !videoTitle) return;

                    var $card = $('<div class="video-card"></div>');

                    var $thumb = $('<div class="video-card-thumb"></div>');
                    var $thumbLink = $('<a></a>').attr('href', pageUrl);

                    var $thumbImg = $('<img>')
                        .attr('src', 'https://i.ytimg.com/vi/' + videoId + '/hqdefault.jpg')
                        .attr('alt', videoTitle)
                        .css({
                            'width': '100%',
                            'height': '100%',
                            'object-fit': 'cover'
                        });

                    var $playButton = $('<div class="video-card-play">▶</div>');

                    $thumbLink.append($thumbImg).append($playButton);
                    $thumb.append($thumbLink);

                    var $info = $('<div class="video-card-info"></div>');
                    var $titleLink = $('<a></a>')
                        .attr('href', pageUrl)
                        .text(videoTitle);
                    $info.append($titleLink);

                    $card.append($thumb).append($info);
                    $gallery.append($card);
                });

                if ($gallery.children().length > 0) {
                    $container.replaceWith($gallery);
                }
            });

            // Transform category page playlist gallery (works for all nursing categories)
            var pageName = mw.config.get('wgPageName');
            if (pageName === 'Category:Level_Up_RN_Videos' ||
                pageName === 'Category:Level_Up_RN' ||
                pageName === 'Category:Nursing.com_Videos' ||
                pageName === 'Category:Simple_Nursing_Videos') {

                var $table = $('.wikitable.sortable').first();
                if (!$table.length) return;

                var $gallery = $('<div class="playlists-gallery"></div>');

                $table.find('tr').each(function(index) {
                    if (index === 0) return;

                    var $row = $(this);
                    var $cells = $row.find('td');
                    if ($cells.length < 3) return;

                    var $titleCell = $cells.eq(0);
                    var $descCell = $cells.eq(1);

                    var playlistId = $titleCell.attr('data-playlist-id');
                    var $titleLink = $titleCell.find('a').first();
                    var wikiPageUrl = $titleLink.attr('href');
                    var title = $titleLink.text();
                    var description = $descCell.text().trim();

                    if (!playlistId || !wikiPageUrl) return;

                    var $box = $('<div class="playlist-box"></div>');

                    // Make the entire box clickable
                    $box.css('cursor', 'pointer').on('click', function(e) {
                        if (!$(e.target).is('a')) {
                            window.location.href = wikiPageUrl;
                        }
                    });

                    var $thumb = $('<div class="playlist-box-thumb"></div>');

                    // Use YouTube iframe for thumbnail with pointer-events: none
                    var $thumbFrame = $('<iframe>')
                        .attr({
                            'src': 'https://www.youtube.com/embed/videoseries?list=' + playlistId + '&controls=0&showinfo=0&rel=0&modestbranding=1',
                            'frameborder': '0',
                            'loading': 'lazy'
                        })
                        .css({
                            'position': 'absolute',
                            'top': '0',
                            'left': '0',
                            'width': '100%',
                            'height': '100%',
                            'pointer-events': 'none'
                        });

                    $thumb.append($thumbFrame);
                    $thumb.append('<div class="playlist-box-overlay">▶ Playlist</div>');

                    var $info = $('<div class="playlist-box-info"></div>');
                    $info.append('<div class="playlist-box-title">' + title + '</div>');
                    if (description) {
                        $info.append('<div style="margin: 8px 0; font-size: 13px; color: #666;">' + description + '</div>');
                    }
                    $info.append('<a href="' + wikiPageUrl + '" class="playlist-box-link" onclick="event.stopPropagation();">Watch Playlist →</a>');

                    $box.append($thumb).append($info);
                    $gallery.append($box);
                });

                if ($gallery.children().length > 0) {
                    $table.replaceWith($gallery);
                }
            }
        });
    });
})();