Skip to content

Commit

Permalink
Merge branch 'eslint' into codeclimate
Browse files Browse the repository at this point in the history
* eslint:
  remarks correction #18
  remarks correction #17
  remarks correction #16
  remarks correction #15
  remarks correction #14
  remarks correction #13
  remarks correction #12
  remarks correction #11
  remarks correction #10
  remarks correction #9
  remarks correction #8
  remarks correction #7
  remarks correction #6
  remarks correction #5
  remarks correction #4
  remarks correction #3
  remarks correction #2
  remarks correction #1
  Add eslint to TravisCI and .eslintrc.json
  • Loading branch information
z4y4ts committed Jan 20, 2017
2 parents 1cf4401 + dec523e commit 998bd4e
Show file tree
Hide file tree
Showing 12 changed files with 700 additions and 662 deletions.
23 changes: 23 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"extends": "eslint-config-edx",
"globals": {
"videojs": true,
"domReady": true
},
"rules": {
"no-underscore-dangle": [
"error", {"allow": [
// VideoJS components' attributes
"childNameIndex_", "el_", "kind_", "labelEl_", "options_", "player_"
]}
],
"require-jsdoc": ["error", {
"require": {
"FunctionDeclaration": true,
"MethodDefinition": true,
"ClassDeclaration": true,
"ArrowFunctionExpression": false
}
}]
}
}
8 changes: 8 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,13 @@ language: python
python:
- "2.7"

before_install:
# Install latest stable NodeJS version. Required for eslint.
- nvm install stable

before_script:
- npm install eslint eslint-config-edx

script:
- "pylint video_xblock"
- "eslint video_xblock/static/js/"
25 changes: 13 additions & 12 deletions video_xblock/static/js/brightcove-videojs-init.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
domReady(function(){
window.videojs = videojs;
var player = videojs('{{ video_player_id }}');
videojs.plugin('xblockEventPlugin', window.xblockEventPlugin);
player.xblockEventPlugin();
videojs.plugin('offset', window.vjsoffset);
domReady(function() {
'use strict';
var player = videojs('{{ video_player_id }}');
window.videojs = videojs;
videojs.plugin('xblockEventPlugin', window.xblockEventPlugin);
player.xblockEventPlugin();
videojs.plugin('offset', window.vjsoffset);

player.offset({
"start": 0, // do not use quotes for this properties for correct plugin work
"end": 0
});
player.offset({
start: 0, // do not use quotes for this properties for correct plugin work
end: 0
});

videojs.plugin('videoJSSpeedHandler', window.videoJSSpeedHandler);
player.videoJSSpeedHandler();
videojs.plugin('videoJSSpeedHandler', window.videoJSSpeedHandler);
player.videoJSSpeedHandler();
});
241 changes: 121 additions & 120 deletions video_xblock/static/js/player-context-menu.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,132 +12,133 @@
* Initialise player context menu with nested elements.
*/
domReady(function() {
'use strict';
var videoPlayer = document.getElementById('{{ video_player_id }}');
var dataSetup = JSON.parse(videoPlayer.getAttribute('data-setup'));
var playbackRates = dataSetup.playbackRates;
var docfrag = document.createDocumentFragment();
// VideoJS Player() object necessary for context menu creation
var player = videojs('{{ video_player_id }}');

var videoPlayer = document.getElementById("{{ video_player_id }}");
var dataSetup = JSON.parse(videoPlayer.getAttribute('data-setup'));
var playbackRates = dataSetup.playbackRates;
var docfrag = document.createDocumentFragment();
// VideoJS Player() object necessary for context menu creation
var player = videojs('{{ video_player_id }}');

/**
* Cross-browser wrapper for element.matches
* Source: https://gist.github.com/dalgard/7817372
*/
function matchesSelector(dom_element, selector) {
var matchesSelector =
dom_element.matches ||
dom_element.matchesSelector ||
dom_element.webkitMatchesSelector ||
dom_element.mozMatchesSelector ||
dom_element.msMatchesSelector ||
dom_element.oMatchesSelector;
return matchesSelector.call(dom_element, selector);
}

/**
* Create elements of nested context submenu.
*/
function createNestedContextSubMenu(e) {
var target = e.target;
var labelElement = target.innerText;
var labelItem = getItem('speed').label;

// Generate nested submenu elements as document fragment
var ulSubMenu = document.createElement('ul');
ulSubMenu.className = 'vjs-contextmenu-ui-submenu';
playbackRates.forEach(function(rate) {
var liSubMenu = document.createElement('li');
liSubMenu.className = 'vjs-submenu-item';
liSubMenu.innerHTML = rate + 'x';
ulSubMenu.appendChild(liSubMenu);
liSubMenu.onclick = function() {
player.playbackRate(parseFloat(rate));
};
});
docfrag.appendChild(ulSubMenu);

// Check conditions to be met for delegation of the popup submenu creation
var menuItemClicked = matchesSelector(target, "li.vjs-menu-item");
var noSubmenuClicked = !target.querySelector('.vjs-contextmenu-ui-submenu');
var menuItemsLabelsEqual = (labelElement === labelItem);

// Wrap into conditional statement to avoid unnecessary variables initialization
if (menuItemClicked && noSubmenuClicked) {
var labelLength = labelElement.length;
const lineFeedCode = 10;
// Check if the last character is an escaped one (line feed to get rid of) which is the case for Microsoft Edge
if (labelElement.charCodeAt(labelLength-1) === lineFeedCode) {
var labelElementSliced = labelElement.slice(0, -1);
menuItemsLabelsEqual = (labelElementSliced === labelItem);
}
}

// Create nested submenu
if (menuItemClicked && noSubmenuClicked && menuItemsLabelsEqual){
target.appendChild(docfrag);
/**
* Cross-browser wrapper for element.matches
* Source: https://gist.github.com/dalgard/7817372
*/
function matchesSelector(domElement, selector) {
var matchesSelector = // eslint-disable-line no-shadow
domElement.matches ||
domElement.matchesSelector ||
domElement.webkitMatchesSelector ||
domElement.mozMatchesSelector ||
domElement.msMatchesSelector ||
domElement.oMatchesSelector;
return matchesSelector.call(domElement, selector);
}
}

// Delegate creation of a nested submenu for a context menu
videoPlayer.addEventListener('mouseover', createNestedContextSubMenu);
/**
* Create elements of nested context submenu.
*/
function createNestedContextSubMenu(e) {
var target = e.target;
var labelElement = target.innerText;
var labelItem = getItem('speed').label; // eslint-disable-line no-use-before-define
// Check conditions to be met for delegation of the popup submenu creation
var menuItemClicked = matchesSelector(target, 'li.vjs-menu-item');
var noSubmenuClicked = !target.querySelector('.vjs-contextmenu-ui-submenu');
var menuItemsLabelsEqual = (labelElement === labelItem);
// Generate nested submenu elements as document fragment
var ulSubMenu = document.createElement('ul');
// Wrap into conditional statement to avoid unnecessary variables initialization
if (menuItemClicked && noSubmenuClicked) {
var labelLength = labelElement.length; // eslint-disable-line vars-on-top
var lineFeedCode = 10; // eslint-disable-line vars-on-top
// Check if the last character is an escaped one (line feed to get rid of)
// which is the case for Microsoft Edge
if (labelElement.charCodeAt(labelLength - 1) === lineFeedCode) {
var labelElementSliced = labelElement.slice(0, -1); // eslint-disable-line vars-on-top
menuItemsLabelsEqual = (labelElementSliced === labelItem);
}
}
ulSubMenu.className = 'vjs-contextmenu-ui-submenu';
playbackRates.forEach(function(rate) {
var liSubMenu = document.createElement('li');
liSubMenu.className = 'vjs-submenu-item';
liSubMenu.innerHTML = rate + 'x';
ulSubMenu.appendChild(liSubMenu);
liSubMenu.onclick = function() {
player.playbackRate(parseFloat(rate));
};
});
docfrag.appendChild(ulSubMenu);

// Create context menu options
var content = [{
id: "play",
label: 'Play',
listener: function () {
var item = getItem('play');
if (player.paused()) {
player.play();
item.label = 'Pause';
} else {
player.pause();
item.label = 'Play';
}
}}, {
id: "mute",
label: 'Mute',
listener: function () {
var item = getItem('mute');
if (player.muted()){
player.muted(false);
item.label = 'Mute';
} else {
player.muted(true);
item.label = 'Unmute';
}
}}, {
id: "fullscreen",
label: 'Fill browser',
listener: function () {
var item = getItem('fullscreen');
if (player.isFullscreen()){
player.exitFullscreen();
item.label = 'Fill browser';
} else {
player.requestFullscreen();
item.label = 'Unfill browser';
}
}}, {
// Nested submenu creation is delegated to the player
id: "speed",
label: 'Speed'
// Create nested submenu
if (menuItemClicked && noSubmenuClicked && menuItemsLabelsEqual) {
target.appendChild(docfrag);
}
}
];

// Fire up vjs-contextmenu-ui plugin
player.contextmenuUI({content: content});
// Delegate creation of a nested submenu for a context menu
videoPlayer.addEventListener('mouseover', createNestedContextSubMenu);

// Create context menu options
var content = [ // eslint-disable-line vars-on-top
{
id: 'play',
label: 'Play',
listener: function() {
var item = getItem('play'); // eslint-disable-line no-use-before-define
if (player.paused()) {
player.play();
item.label = 'Pause';
} else {
player.pause();
item.label = 'Play';
}
}
}, {
id: 'mute',
label: 'Mute',
listener: function() {
var item = getItem('mute'); // eslint-disable-line no-use-before-define
if (player.muted()) {
player.muted(false);
item.label = 'Mute';
} else {
player.muted(true);
item.label = 'Unmute';
}
}
}, {
id: 'fullscreen',
label: 'Fill browser',
listener: function() {
var item = getItem('fullscreen'); // eslint-disable-line no-use-before-define
if (player.isFullscreen()) {
player.exitFullscreen();
item.label = 'Fill browser';
} else {
player.requestFullscreen();
item.label = 'Unfill browser';
}
}
}, {
// Nested submenu creation is delegated to the player
id: 'speed',
label: 'Speed'
}
];

// Update context menu labels
var getItem = (function(contextmenuUI) {
var hash = {};
contextmenuUI.content.forEach(function(item) {
hash[item.id] = item;
});
return function(id) {
return hash[id];
};
}(player.contextmenuUI));
// Fire up vjs-contextmenu-ui plugin
player.contextmenuUI({content: content});

// Update context menu labels
var getItem = (function(contextmenuUI) { // eslint-disable-line vars-on-top
var hash = {};
contextmenuUI.content.forEach(function(item) {
hash[item.id] = item;
});
return function(id) {
return hash[id];
};
}(player.contextmenuUI));
});
Loading

0 comments on commit 998bd4e

Please sign in to comment.