shaka-player
Version:
DASH/EME video player library
219 lines (189 loc) • 6.12 kB
JavaScript
/*! @license
* Shaka Player
* Copyright 2016 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
goog.provide('shakaDemo.InputContainer');
goog.require('shakaDemo.Tooltips');
/**
* Creates elements for containing inputs. It represents a single "section" of
* input.
* It contains a number of "rows", each of which contains an optional label and
* an input.
* It also has an optional header, which can contain style-dependent
* functionality.
*/
shakaDemo.InputContainer = class {
/**
* @param {!Element} parentDiv
* @param {?string} headerText The text to be displayed by the header.
* If null, there will be no header.
* @param {!shakaDemo.InputContainer.Style} style
* @param {?string} docLink
*/
constructor(parentDiv, headerText, style, docLink) {
/** @private {!shakaDemo.InputContainer.Style} */
this.style_ = style;
/** @private {?Element} */
this.header_;
/** @private {!Element} */
this.table_ = document.createElement('div');
/** @private {?Element} */
this.latestRow_;
/** @private {?string} */
this.defaultRowClass_ = null;
/** @type {?Element} */
this.latestElementContainer;
/** @type {?string} */
this.latestTooltip;
/** @private {number} */
this.numRows_ = 0;
if (headerText) {
this.createHeader_(parentDiv, headerText);
}
this.table_.classList.add(style);
if (style == shakaDemo.InputContainer.Style.ACCORDION) {
this.table_.classList.add('hidden');
}
parentDiv.appendChild(this.table_);
if (docLink) {
this.addDocLink_(this.table_, docLink);
}
}
/**
* @return {boolean} true if this is an open accordion menu, false otherwise
*/
getIsOpen() {
if (this.style_ == shakaDemo.InputContainer.Style.ACCORDION) {
return this.table_.classList.contains('show');
}
return false;
}
/** If this is an accordion menu, open it. */
open() {
if (!this.style_ == shakaDemo.InputContainer.Style.ACCORDION) {
return;
}
this.table_.classList.remove('hidden');
setTimeout(() => {
this.table_.classList.add('show');
}, /* milliseconds= */ 20);
this.header_.classList.add('mdl-button--colored');
}
/** If this is an accordion menu, close it. */
close() {
if (this.style_ != shakaDemo.InputContainer.Style.ACCORDION) {
return;
}
this.table_.classList.remove('show');
this.table_.addEventListener('transitionend', (e) => {
this.table_.classList.add('hidden');
}, {once: true});
this.header_.classList.remove('mdl-button--colored');
}
/**
* @param {!Element} parentDiv
* @param {string} headerText
* @private
*/
createHeader_(parentDiv, headerText) {
if (this.style_ == shakaDemo.InputContainer.Style.ACCORDION) {
this.header_ = document.createElement('button');
this.header_.classList.add('mdl-button--raised');
this.header_.classList.add('mdl-button');
this.header_.classList.add('mdl-js-button');
this.header_.classList.add('mdl-js-ripple-effect');
this.header_.addEventListener('click', () => {
// Show/hide the table.
if (this.getIsOpen()) {
this.close();
} else {
this.open();
}
});
} else {
this.header_ = document.createElement('div');
this.header_.classList.add('input-header');
}
this.header_.textContent = headerText;
parentDiv.appendChild(this.header_);
}
/**
* Creates a link that links to a section within the Shaka Player docs.
* @param {!Element} parentDiv
* @param {string} docLink
* @private
*/
addDocLink_(parentDiv, docLink) {
const link = /** @type {!HTMLAnchorElement} */(document.createElement('a'));
link.href = docLink;
link.target = '_blank';
link.classList.add('mdl-button');
link.classList.add('mdl-js-button');
link.classList.add('mdl-js-ripple-effect');
link.classList.add('mdl-button--colored');
const icon = document.createElement('i');
icon.classList.add('material-icons-round');
icon.textContent = 'help';
link.appendChild(icon);
parentDiv.appendChild(link);
}
/**
* Set the default row class for future calls to addRow().
*
* @param {?string} rowClass
*/
setDefaultRowClass(rowClass) {
this.defaultRowClass_ = rowClass;
}
/**
* Return the CSS class list for the container.
*
* @return {!DOMTokenList}
*/
getClassList() {
return this.table_.classList;
}
/**
* Makes a row, for storing an input.
* @param {?string} labelString
* @param {?string} tooltipString
* @param {string=} rowClass
*/
addRow(labelString, tooltipString, rowClass) {
rowClass = rowClass || this.defaultRowClass_ || '';
this.latestRow_ = document.createElement('div');
if (rowClass) {
this.latestRow_.classList.add(rowClass);
}
this.table_.appendChild(this.latestRow_);
const elementId = 'input-container-row-' + this.numRows_;
this.numRows_ += 1;
if (labelString) {
const label = document.createElement('label');
label.setAttribute('for', elementId);
label.classList.add('input-container-label');
const labelText = document.createElement('b');
labelText.textContent = labelString;
label.appendChild(labelText);
this.latestRow_.appendChild(label);
}
this.latestElementContainer = document.createElement('div');
this.latestRow_.appendChild(this.latestElementContainer);
this.latestElementContainer.classList.add('input-container-row');
this.latestElementContainer.id = elementId;
this.latestTooltip = tooltipString;
if (tooltipString) {
shakaDemo.Tooltips.make(this.latestRow_, tooltipString);
// Keep the row from being focused.
this.latestRow_.setAttribute('tabindex', -1);
this.latestRow_.classList.add('borderless');
}
}
};
/** @enum {string} */
shakaDemo.InputContainer.Style = {
VERTICAL: 'input-container-style-vertical',
ACCORDION: 'input-container-style-accordion',
FLEX: 'input-container-style-flex',
};