From 18bf4d84b9dc087540aa0de633e1e6eb107e2b42 Mon Sep 17 00:00:00 2001 From: Sam Potts Date: Tue, 28 Mar 2017 00:12:33 +1100 Subject: Menu creation (WIP) --- src/js/plyr.js | 283 +++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 196 insertions(+), 87 deletions(-) (limited to 'src') diff --git a/src/js/plyr.js b/src/js/plyr.js index 98009041..9f966db8 100644 --- a/src/js/plyr.js +++ b/src/js/plyr.js @@ -417,7 +417,7 @@ // Set attributes function setAttributes(element, attributes) { for (var key in attributes) { - element.setAttribute(key, (is.boolean(attributes[key]) && attributes[key]) ? '' : attributes[key]); + element.setAttribute(key, attributes[key]); } } @@ -817,7 +817,7 @@ // Picture-in-picture support // Safari only currently pip: (function() { - return is.function(document.createElement('video').webkitSetPresentationMode); + return is.function(createElement('video').webkitSetPresentationMode); })(), // Airplay support // Safari only currently @@ -870,12 +870,18 @@ var plyr = this; var timers = {}; var api; + + // Elements cache var elements = { buttons: {}, display: {}, progress: {}, - inputs: {} - } + inputs: {}, + settings: { + tabs: {}, + panes: {} + } + }; // Set media plyr.media = media; @@ -901,10 +907,10 @@ } } var log = function() { - logger('log', arguments) + logger('log', arguments); }; var warn = function() { - logger('warn', arguments) + logger('warn', arguments); }; // Log config options and support @@ -961,10 +967,10 @@ insertElement(type, plyr.media, { src: attributes }); - } else if (attributes.constructor === Array) { - for (var i = attributes.length - 1; i >= 0; i--) { - insertElement(type, plyr.media, attributes[i]); - } + } else if (is.array(attributes)) { + attributes.forEach(function(attribute) { + insertElement(type, plyr.media, attribute); + }); } } @@ -976,22 +982,6 @@ }; } - // Build a list of available captions - function buildCaptionsMenu() { - var trackSubs = ''; - - if (is.array(config.tracks) && !is.empty(config.tracks)) { - config.tracks.forEach(function(track, index) { - if (is.function(track)) { - return; - } - trackSubs += ''; - }); - } - - return trackSubs; - } - // Create icon function createIcon(type, attributes) { var namespace = 'http://www.w3.org/2000/svg'; @@ -1034,15 +1024,24 @@ } // Create a 00:00'); var tooltip = createElement('span', { role: 'tooltip', class: config.classes.tooltip - }); + }, '00:00'); - var value = document.createTextNode('00:00'); - tooltip.appendChild(value); container.appendChild(tooltip); } @@ -1284,24 +1282,132 @@ // Settings button / menu if (inArray(config.controls, 'settings')) { - /* - var captionsMenuItem = ''; - if (inArray(config.controls, 'captions')) { - captionsMenuItem = '
  • '+ - ''+ - '
  • '; - } + var wrapper = createElement('span', extend(getAttributesFromSelector(config.selectors.buttons.settings), { + class: 'plyr__menu' + })); - if (is.array(config.quality.options)) { - var showQuality = ''; - } + wrapper.appendChild(createButton('settings', { + id: 'plyr-settings-toggle-' + data.id, + 'aria-haspopup': true, + 'aria-controls': 'plyr-settings-' + data.id, + 'aria-expanded': false + })); + + var form = createElement('form', { + class: 'plyr__menu__container', + id: 'plyr-settings-' + data.id, + 'aria-hidden': true, + 'aria-labelled-by': 'plyr-settings-toggle-' + data.id, + role: 'tablist', + tabindex: -1 + }); + + var inner = createElement('div'); + + var home = createElement('div', { + id: 'plyr-settings-' + data.id + '-home', + 'aria-hidden': false, + 'aria-labelled-by': 'plyr-settings-toggle-' + data.id, + role: 'tabpanel', + tabindex: -1 + }); + + var tabs = createElement('ul', { + role: 'tablist' + }); + + ['captions', 'quality', 'speed', 'loop'].forEach(function(type) { + var tab = createElement('li', { + role: 'tab' + }); + + var button = createElement('button', extend(getAttributesFromSelector(config.selectors.buttons.settings), { + type: 'button', + class: 'plyr__control plyr__control--forward', + id: 'plyr-settings-' + data.id + '-' + type + '-tab', + 'aria-haspopup': true, + 'aria-controls': 'plyr-settings-' + data.id + '-' + type, + 'aria-expanded': false + }), config.i18n[type]); + + var value = createElement('span', { + class: 'plyr__menu__value' + }); - html.push( + // Speed contains HTML entities + value.innerHTML = data[type]; + + button.appendChild(value); + + tab.appendChild(button); + + tabs.appendChild(tab); + }); + + home.appendChild(tabs); + + inner.appendChild(home); + + ['captions', 'quality', 'speed', 'loop'].forEach(function(type) { + var pane = createElement('div', { + id: 'plyr-settings-' + data.id + '-' + type, + 'aria-hidden': true, + 'aria-labelled-by': 'plyr-settings-tab-' + data.id, + role: 'tabpanel', + tabindex: -1 + }); + + var options = createElement('ul'); + + var option = createElement('li'); + + var back = createElement('button', { + type: 'button', + class: 'plyr__control plyr__control--back', + 'aria-haspopup': true, + 'aria-controls': 'plyr-settings-' + data.id + '-home', + 'aria-expanded': false + }, config.i18n.back); + + option.appendChild(back); + + options.appendChild(option); + + switch (type) { + case 'captions': + if (is.array(config.tracks)) { + config.tracks.forEach(function(track, index) { + if (is.function(track)) { + return; + } + + var option = createElement('li'); + + var button = createButton('language', { + 'data-language': track.srclang, + 'data-index': index + }, track.label); + + option.appendChild(button); + + options.appendChild(options); + }); + } + break; + } + + pane.appendChild(options); + + inner.appendChild(pane); + }); + + form.appendChild(inner); + + wrapper.appendChild(form); + + controls.appendChild(wrapper); + + /*html.push( '
    ', '