MediaWiki:Common.js: Difference between revisions

From Doc-Wiki
Jump to navigation Jump to search
Comprehensive fix for Level Up RN playlist embeds and thumbnails
Added support for Simple Nursing Videos category gallery
 
(6 intermediate revisions by the same user not shown)
Line 5: Line 5:




/* Level Up RN - Comprehensive Fix for Playlists */
 
 
 
 
 
 
 
/* Level Up RN, Nursing.com & Simple Nursing - Video Galleries and Embeds */
(function() {
(function() {
     'use strict';
     'use strict';
Line 12: Line 19:
         $(document).ready(function() {
         $(document).ready(function() {


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


                 if (playlistId) {
                 if (videoId) {
                     var iframe = $('<iframe>')
                     var iframe = $('<iframe>')
                         .attr({
                         .attr({
                             'src': 'https://www.youtube.com/embed/videoseries?list=' + playlistId,
                             'src': 'https://www.youtube.com/embed/' + videoId,
                             'frameborder': '0',
                             'frameborder': '0',
                             'allow': 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture',
                             'allow': 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share',
                             'allowfullscreen': ''
                             'allowfullscreen': '',
                            'referrerpolicy': 'strict-origin-when-cross-origin'
                         })
                         })
                         .css({
                         .css({
Line 34: Line 42:


                     $container.empty().append(iframe);
                     $container.empty().append(iframe);
                    console.log('Created iframe for playlist:', playlistId);
                 }
                 }
             });
             });


             // Fix 2: Transform gallery table with real thumbnails
             // 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');
             var pageName = mw.config.get('wgPageName');
             if (pageName === 'Category:Level_Up_RN_Videos' || pageName === 'Category:Level_Up_RN') {
             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();
                 var $table = $('.wikitable.sortable').first();
                 if (!$table.length) return;
                 if (!$table.length) return;
Line 47: Line 105:


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


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


Line 65: Line 122:
                     if (!playlistId || !wikiPageUrl) return;
                     if (!playlistId || !wikiPageUrl) return;


                    // Create card
                     var $box = $('<div class="playlist-box"></div>');
                     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>');
                     var $thumb = $('<div class="playlist-box-thumb"></div>');
                    var $thumbLink = $('<a></a>').attr('href', wikiPageUrl);


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


                    // Fetch thumbnail using JSONP
                     $thumb.append($thumbFrame);
                     $.ajax({
                     $thumb.append('<div class="playlist-box-overlay">▶ Playlist</div>');
                        url: 'https://www.youtube.com/oembed?url=https://www.youtube.com/playlist?list=' + playlistId + '&format=json',
                        dataType: 'jsonp',
                        success: function(data) {
                            if (data && data.thumbnail_url) {
                                $img.attr('src', data.thumbnail_url);
                            }
                        },
                        error: function() {
                            // Fallback: use generic YouTube playlist icon
                            $img.attr('src', 'data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' width=\'120\' height=\'90\'%3E%3Crect fill=\'%23E52D27\' width=\'120\' height=\'90\'/%3E%3Cpath fill=\'%23fff\' d=\'M60 20L30 70h20v10h20V70h20z\'/%3E%3C/svg%3E');
                        }
                    });
 
                    $thumbLink.append($img);
                     $thumbLink.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>');
Line 106: Line 157:
                         $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="' + wikiPageUrl + '" 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);

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);
                }
            }
        });
    });
})();