[FIX] web: fix zoomodoo attachToTarget/dashboard compatible
Issue
- Install Employees & Dashboard
- Add employees to kanban
- Dashboard
- Hover an employee picture
There is only the picture visible
on the page, the remaining space is white.
Cause
I found several issues.
1. The pictures are not shown on hover in employees
But they are on dashboard.
2. $attach = all `.content` and on dashboard there is
2 `.content` so the flyout is append 2 times
3. The move method is trigerred on hover too, it hides
the flyout if we are not in it. But with attachToTarget
we are not in it so it's hidden all time.
4. If everything above is solved, the image is shown but
not at the correct position because the flyout base
position is not top 0, left 0
Solution
1. Reduce the minimum required size to 128px
2. use closest instead of parents
3. Don't hide if we have the option attachToTarget
4. Calculate the flyout offset and replace it correctly
and set it to position fixed to handle scrolling
OPW-2291493
closes odoo/odoo#54333
X-original-commit: 2c6d692ee40c97d2ae63da64db7623702948407e
Signed-off-by: Nicolas Lempereur (nle) <nle@odoo.com>
Signed-off-by: Jason Van Malder (jvm) <jvm@odoo.com>
This commit is contained in:
@@ -1912,7 +1912,9 @@ var FieldBinaryImage = AbstractFieldBinary.extend({
|
||||
attach: '.o_content',
|
||||
attachToTarget: true,
|
||||
onShow: function () {
|
||||
if(this.$zoom.height() < 256 && this.$zoom.width() < 256) {
|
||||
var zoomHeight = Math.ceil(this.$zoom.height());
|
||||
var zoomWidth = Math.ceil(this.$zoom.width());
|
||||
if( zoomHeight < 128 && zoomWidth < 128) {
|
||||
this.hide();
|
||||
}
|
||||
core.bus.on('keydown', this, this.hide);
|
||||
|
||||
@@ -84,8 +84,8 @@ ZoomOdoo.prototype._init = function () {
|
||||
this.$flyout = $('<div class="zoomodoo-flyout" />');
|
||||
|
||||
var $attach = this.$target;
|
||||
if (this.opts.attach !== undefined && this.$target.parents(this.opts.attach).length) {
|
||||
$attach = this.$target.parents(this.opts.attach);
|
||||
if (this.opts.attach !== undefined && this.$target.closest(this.opts.attach).length) {
|
||||
$attach = this.$target.closest(this.opts.attach);
|
||||
}
|
||||
$attach.parent().on('mousemove.zoomodoo touchmove.zoomodoo', $.proxy(this._onMove, this));
|
||||
$attach.parent().on('mouseleave.zoomodoo touchend.zoomodoo', $.proxy(this._onLeave, this));
|
||||
@@ -120,8 +120,8 @@ ZoomOdoo.prototype.show = function (e, testMouseOver) {
|
||||
}
|
||||
|
||||
var $attach = this.$target;
|
||||
if (this.opts.attach !== undefined && this.$target.parents(this.opts.attach).length) {
|
||||
$attach = this.$target.parents(this.opts.attach);
|
||||
if (this.opts.attach !== undefined && this.$target.closest(this.opts.attach).length) {
|
||||
$attach = this.$target.closest(this.opts.attach);
|
||||
}
|
||||
|
||||
// Prevents having multiple zoom flyouts
|
||||
@@ -132,6 +132,19 @@ ZoomOdoo.prototype.show = function (e, testMouseOver) {
|
||||
if (this.opts.attachToTarget) {
|
||||
this.opts.beforeAttach.call(this);
|
||||
|
||||
// Be sure that the flyout is at top 0, left 0 to ensure correct computation
|
||||
// e.g. employees kanban on dashboard
|
||||
this.$flyout.css('position', 'fixed');
|
||||
var flyoutOffset = this.$flyout.offset();
|
||||
if (flyoutOffset.left > 0) {
|
||||
var flyoutLeft = parseFloat(this.$flyout.css('left').replace('px',''));
|
||||
this.$flyout.css('left', flyoutLeft - flyoutOffset.left + 'px');
|
||||
}
|
||||
if (flyoutOffset.top > 0) {
|
||||
var flyoutTop = parseFloat(this.$flyout.css('top').replace('px',''));
|
||||
this.$flyout.css('top', flyoutTop - flyoutOffset.top + 'px');
|
||||
}
|
||||
|
||||
if(this.$zoom.height() < this.$flyout.height()) {
|
||||
this.$flyout.css('height', this.$zoom.height() + 'px');
|
||||
}
|
||||
@@ -296,7 +309,7 @@ ZoomOdoo.prototype._move = function (e) {
|
||||
var xl = Math.ceil(pl * rw);
|
||||
|
||||
// Close if outside
|
||||
if (xl < 0 || xt < 0 || xl > dw || xt > dh || lx > (offset.left + this.$target.outerWidth())) {
|
||||
if (!this.opts.attachToTarget && (xl < 0 || xt < 0 || xl > dw || xt > dh || lx > (offset.left + this.$target.outerWidth()))) {
|
||||
this.hide();
|
||||
} else {
|
||||
var top = xt * -1;
|
||||
|
||||
Reference in New Issue
Block a user