Skip to content

Instantly share code, notes, and snippets.

@camskene
Last active June 21, 2019 15:40
Show Gist options
  • Save camskene/5a1d134498ad862e64e00bf35ac0acdd to your computer and use it in GitHub Desktop.
Save camskene/5a1d134498ad862e64e00bf35ac0acdd to your computer and use it in GitHub Desktop.
Ember Tooltip with `in-element`
import Ember from 'ember';
export default Ember.Controller.extend({
data: ['a', 'b', 'c', 'd', 'e'],
});
import Ember from 'ember';
export default Ember.Component.extend({
});
<ul>
{{#each componentProps as |prop|}}
<li>{{prop}}</li>
{{/each}}
</ul>
<button>
Hello
{{#x-tooltip}}World{{/x-tooltip}}
</button>
<button>
Foo
{{#x-tooltip}}
Bar
{{/x-tooltip}}
</button>
<button>
Qux
{{#x-tooltip}}
Quux
{{/x-tooltip}}
</button>
<button>
Custom
{{#x-tooltip}}
{{my-custom-tooltip componentProps=data}}
{{/x-tooltip}}
</button>
<br>
<br>
<br>
<br>
<div id="tooltip-portal"></div>
{
"version": "0.15.1",
"EmberENV": {
"FEATURES": {}
},
"options": {
"use_pods": true,
"enable-testing": false
},
"dependencies": {
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js",
"ember": "3.4.3",
"ember-template-compiler": "3.4.3",
"ember-testing": "3.4.3"
},
"addons": {}
}
import Ember from 'ember';
export default Ember.Component.extend({
isTooltipVisible: false,
tooltipTarget: '',
tooltipPortal: '',
toggleTooltip() {
this.setTooltipPortal();
this.setTooltipTarget();
Ember.set(this, 'isTooltipVisible', !this.get('isTooltipVisible'));
},
addEventListeners() {
this.element.parentNode.addEventListener('mouseenter', this.toggleTooltip.bind(this));
this.element.parentNode.addEventListener('mouseleave', this.toggleTooltip.bind(this));
},
removeEventListeners() {
this.element.parentNode.removeEventListener('mouseenter', this.toggleTooltip);
this.element.parentNode.removeEventListener('mouseleave', this.toggleTooltip);
},
setTooltipPortal() {
Ember.set(this, 'tooltipPortal', document.getElementById('tooltip-portal'));
},
setTooltipTarget() {
Ember.set(this, 'tooltipTarget', this.element.parentNode);
},
didInsertElement() {
this.addEventListeners();
},
willDestroyElement() {
this.removeEventListeners();
},
});
{{#if isTooltipVisible}}
{{#-in-element tooltipPortal}}
{{#x-velcro targetElement=tooltipTarget offsetTop='' offsetLeft=''}}
{{yield}}
{{/x-velcro}}
{{/-in-element}}
{{/if}}
import Ember from 'ember';
export default Ember.Component.extend({
targetOffset: Ember.computed('targetElement', function() {
let { offsetTop: top, offsetLeft: left } = this.targetElement;
return { top: top + this.targetElement.clientHeight + 10, left };
}),
didRender() {
this._super(...arguments);
this.element.style.position = 'absolute';
this.element.style.top = this.targetOffset.top + 'px';
this.element.style.left = this.targetOffset.left + 'px';
},
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment