summernote-webpack
Version:
Super simple WYSIWYG editor
76 lines (64 loc) • 2.05 kB
JavaScript
define([
'summernote/base/core/agent',
'summernote/base/core/func',
'summernote/base/core/list',
'summernote/base/core/dom'
], function (agent, func, list, dom) {
var AirPopover = function (context) {
var self = this;
var ui = $.summernote.ui;
var options = context.options;
var AIR_MODE_POPOVER_X_OFFSET = 20;
this.events = {
'summernote.keyup summernote.mouseup summernote.scroll': function () {
self.update();
},
'summernote.change summernote.dialog.shown': function () {
self.hide();
},
'summernote.focusout': function (we, e) {
// [workaround] Firefox doesn't support relatedTarget on focusout
// - Ignore hide action on focus out in FF.
if (agent.isFF) {
return;
}
if (!e.relatedTarget || !dom.ancestor(e.relatedTarget, func.eq(self.$popover[0]))) {
self.hide();
}
}
};
this.shouldInitialize = function () {
return options.airMode && !list.isEmpty(options.popover.air);
};
this.initialize = function () {
this.$popover = ui.popover({
className: 'note-air-popover'
}).render().appendTo('body');
var $content = this.$popover.find('.popover-content');
context.invoke('buttons.build', $content, options.popover.air);
};
this.destroy = function () {
this.$popover.remove();
};
this.update = function () {
var styleInfo = context.invoke('editor.currentStyle');
if (styleInfo.range && !styleInfo.range.isCollapsed()) {
var rect = list.last(styleInfo.range.getClientRects());
if (rect) {
var bnd = func.rect2bnd(rect);
this.$popover.css({
display: 'block',
left: Math.max(bnd.left + bnd.width / 2, 0) - AIR_MODE_POPOVER_X_OFFSET,
top: bnd.top + bnd.height
});
}
} else {
this.hide();
}
};
this.hide = function () {
this.$popover.hide();
};
};
return AirPopover;
});