summaryrefslogtreecommitdiff
path: root/javascript/videojs/src/js/title-bar.js
diff options
context:
space:
mode:
Diffstat (limited to 'javascript/videojs/src/js/title-bar.js')
-rw-r--r--javascript/videojs/src/js/title-bar.js138
1 files changed, 138 insertions, 0 deletions
diff --git a/javascript/videojs/src/js/title-bar.js b/javascript/videojs/src/js/title-bar.js
new file mode 100644
index 0000000..1b59cb8
--- /dev/null
+++ b/javascript/videojs/src/js/title-bar.js
@@ -0,0 +1,138 @@
+import Component from './component';
+import * as Dom from './utils/dom';
+import * as Guid from './utils/guid';
+import * as Obj from './utils/obj';
+
+/**
+ * Displays an element over the player which contains an optional title and
+ * description for the current content.
+ *
+ * Much of the code for this component originated in the now obsolete
+ * videojs-dock plugin: https://github.com/brightcove/videojs-dock/
+ *
+ * @extends Component
+ */
+class TitleBar extends Component {
+
+ constructor(player, options) {
+ super(player, options);
+ this.on('statechanged', (e) => this.updateDom_());
+ this.updateDom_();
+ }
+
+ /**
+ * Create the `TitleBar`'s DOM element
+ *
+ * @return {Element}
+ * The element that was created.
+ */
+ createEl() {
+ this.els = {
+ title: Dom.createEl('div', {
+ className: 'vjs-title-bar-title',
+ id: `vjs-title-bar-title-${Guid.newGUID()}`
+ }),
+ description: Dom.createEl('div', {
+ className: 'vjs-title-bar-description',
+ id: `vjs-title-bar-description-${Guid.newGUID()}`
+ })
+ };
+
+ return Dom.createEl('div', {
+ className: 'vjs-title-bar'
+ }, {}, Obj.values(this.els));
+ }
+
+ /**
+ * Updates the DOM based on the component's state object.
+ */
+ updateDom_() {
+ const tech = this.player_.tech_;
+ const techEl = tech && tech.el_;
+ const techAriaAttrs = {
+ title: 'aria-labelledby',
+ description: 'aria-describedby'
+ };
+
+ ['title', 'description'].forEach(k => {
+ const value = this.state[k];
+ const el = this.els[k];
+ const techAriaAttr = techAriaAttrs[k];
+
+ Dom.emptyEl(el);
+
+ if (value) {
+ Dom.textContent(el, value);
+ }
+
+ // If there is a tech element available, update its ARIA attributes
+ // according to whether a title and/or description have been provided.
+ if (techEl) {
+ techEl.removeAttribute(techAriaAttr);
+
+ if (value) {
+ techEl.setAttribute(techAriaAttr, el.id);
+ }
+ }
+ });
+
+ if (this.state.title || this.state.description) {
+ this.show();
+ } else {
+ this.hide();
+ }
+ }
+
+ /**
+ * Update the contents of the title bar component with new title and
+ * description text.
+ *
+ * If both title and description are missing, the title bar will be hidden.
+ *
+ * If either title or description are present, the title bar will be visible.
+ *
+ * NOTE: Any previously set value will be preserved. To unset a previously
+ * set value, you must pass an empty string or null.
+ *
+ * For example:
+ *
+ * ```
+ * update({title: 'foo', description: 'bar'}) // title: 'foo', description: 'bar'
+ * update({description: 'bar2'}) // title: 'foo', description: 'bar2'
+ * update({title: ''}) // title: '', description: 'bar2'
+ * update({title: 'foo', description: null}) // title: 'foo', description: null
+ * ```
+ *
+ * @param {Object} [options={}]
+ * An options object. When empty, the title bar will be hidden.
+ *
+ * @param {string} [options.title]
+ * A title to display in the title bar.
+ *
+ * @param {string} [options.description]
+ * A description to display in the title bar.
+ */
+ update(options) {
+ this.setState(options);
+ }
+
+ /**
+ * Dispose the component.
+ */
+ dispose() {
+ const tech = this.player_.tech_;
+ const techEl = tech && tech.el_;
+
+ if (techEl) {
+ techEl.removeAttribute('aria-labelledby');
+ techEl.removeAttribute('aria-describedby');
+ }
+
+ super.dispose();
+ this.els = null;
+ }
+}
+
+Component.registerComponent('TitleBar', TitleBar);
+
+export default TitleBar;