in lib/@uncharted/strippets/src/strippets.outline.js [425:488]
Outline.prototype.registerEvents = function() {
var s = this;
s.subscribe();
s.$outline.on('click', s, function(event) {
var outlineContext = event.data;
if ($(event.target).hasClass(s.classes.reader.closeButton)) {
$(event.target).css('visibility', 'hidden');
s.mediator.publish(outlineContext.events.outline.Minimize, outlineContext._id);
return outlineContext.transitionState('minimal');
}
if (s.Settings.onClicked) {
s.Settings.onClicked(s.data);
}
if (outlineContext.getCurrentState() === 'hidden') {
return undefined;
} else if (outlineContext.getCurrentState() === 'expanded') {
return outlineContext.transitionState('readingmode');
} else if (outlineContext.getCurrentState() === 'readingmode') {
// do nothing.
return undefined;
}
var retVal = outlineContext.transitionState('readingmode');
if (!event.shiftKey) {
s.mediator.publish(outlineContext.events.outline.Minimize, outlineContext._id);
}
return retVal;
});
// Register a delegated event for the entities' position-aware tooltips
var entityClass = '.' + s.classes.entity.outlineentity;
s.$outline.on('mouseenter', entityClass, function() {
var $entity = $(this); // eslint-disable-line
var tooltip = $entity.attr('data-entities');
if (tooltip) {
$tooltip.html(tooltip);
$entity.append($tooltip);
// compute the effective scale factor by sizing the tooltip and comparing to the actual result
var scale = util.getParentScale($tooltip);
var $viewport = $('.viewport');
var viewportBounds = $viewport[0].getBoundingClientRect();
var entityBounds = $entity[0].getBoundingClientRect();
var spaceRight = (viewportBounds.right - entityBounds.right); // space to the right of the entity
var spaceLeft = (entityBounds.left - viewportBounds.left); // space to the left of the entity
$tooltip.css('max-width', scale * spaceLeft); // force it to resize to fit the text, if needed, before we measure
var tooltipWidth = $tooltip[0].getBoundingClientRect().width;
var isRightAligned = tooltipWidth > spaceRight && (spaceLeft > tooltipWidth || spaceLeft > spaceRight);
$tooltip.toggleClass('tooltip-left', !isRightAligned);
$tooltip.toggleClass('tooltip-right', isRightAligned);
var maxWidth = isRightAligned ? spaceLeft : spaceRight;
if (maxWidth !== spaceLeft) {
$tooltip.css('max-width', scale * maxWidth);
}
$tooltip.css('word-wrap', maxWidth < tooltipWidth ? 'normal' : 'no-wrap');
}
}).on('mouseleave', entityClass, function() {
$tooltip.toggleClass('tooltip-left tooltip-right', false);
});
};