blob: b0803338be1fd6a270006e6effe1ec71cffbd511 [file] [log] [blame]
// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
/**
* Namespace for the Camera app.
*/
var cca = cca || {};
/**
* Namespace for tooltip.
*/
cca.tooltip = cca.tooltip || {};
/**
* Wrapper element that shows tooltip.
* @type {HTMLElement}
*/
cca.tooltip.wrapper_ = null;
/**
* Hovered element whose tooltip to be shown.
* @type {HTMLElement}
*/
cca.tooltip.hovered_ = null;
/**
* Sets up tooltips for elements.
* @param {NodeList<Element>} elements Elements whose tooltips to be shown.
* @return {NodeList<Element>} Elements whose tooltips have been set up.
*/
cca.tooltip.setup = function(elements) {
cca.tooltip.wrapper_ = document.querySelector('#tooltip');
elements.forEach((element) => {
var handler = () => {
// Handler hides tooltip only when it's for the element.
if (element == cca.tooltip.hovered_) {
cca.tooltip.hide();
}
};
element.addEventListener('mouseout', handler);
element.addEventListener('click', handler);
element.addEventListener('mouseover',
cca.tooltip.show_.bind(undefined, element));
});
return elements;
};
/**
* Positions the tooltip wrapper over the hovered element.
* @private
*/
cca.tooltip.position_ = function() {
const [edgeMargin, elementMargin] = [5, 8];
var wrapper = cca.tooltip.wrapper_;
var hovered = cca.tooltip.hovered_;
var rect = hovered.getBoundingClientRect();
var tooltipTop = rect.top - wrapper.offsetHeight - elementMargin;
if (tooltipTop < edgeMargin) {
tooltipTop = rect.bottom + elementMargin;
}
wrapper.style.top = tooltipTop + 'px';
// Center over the hovered element but avoid touching edges.
var hoveredCenter = rect.left + hovered.offsetWidth / 2;
var left = Math.min(
Math.max(hoveredCenter - wrapper.clientWidth / 2, edgeMargin),
document.body.offsetWidth - wrapper.offsetWidth - edgeMargin);
wrapper.style.left = Math.round(left) + 'px';
};
/**
* Shows a tooltip over the hovered element.
* @param {HTMLElement} element Hovered element whose tooltip to be shown.
* @private
*/
cca.tooltip.show_ = function(element) {
cca.tooltip.hide();
cca.tooltip.wrapper_.textContent = element.getAttribute('aria-label');
cca.tooltip.hovered_ = element;
cca.tooltip.position_();
cca.tooltip.wrapper_.classList.add('visible');
};
/**
* Hides the shown tooltip if any.
*/
cca.tooltip.hide = function() {
if (cca.tooltip.hovered_) {
cca.tooltip.hovered_ = null;
cca.tooltip.wrapper_.textContent = '';
cca.tooltip.wrapper_.classList.remove('visible');
}
};