[FIX] mail: emoji picker additional rendered rows not working

On the emoji picker, additional rendered rows on top and bottom
were not loaded correctly on top.

This commit fixes the top rendered rows not working properly.

Also fixes computation of some fields that should contain
integer values (index) but had float instead, which required
late rounding.

Task-3000424

X-original-commit: 24d9b970d032709b8f80cf49da057156ccd7fde5
Part-of: odoo/odoo#103124
This commit is contained in:
Nemael
2022-10-13 09:19:45 +02:00
committed by Alexandre Kühn
parent 29497f4119
commit 1a28201956
2 changed files with 43 additions and 33 deletions
@@ -4,7 +4,7 @@ import { registerMessagingComponent } from '@mail/utils/messaging_component';
import { useRefToModel } from '@mail/component_hooks/use_ref_to_model';
import { useUpdateToModel } from '@mail/component_hooks/use_update_to_model';
const { Component, onMounted } = owl;
const { Component } = owl;
export class EmojiGridView extends Component {
setup() {
@@ -12,9 +12,6 @@ export class EmojiGridView extends Component {
useRefToModel({ fieldName: 'listRef', refName: 'listRef'});
useRefToModel({ fieldName: 'viewBlockRef', refName: 'viewBlockRef'});
useUpdateToModel({ methodName: 'onComponentUpdate' });
onMounted(() => {
this.emojiGridView.calculateDimensions();
});
}
/**
@@ -7,17 +7,6 @@ import { clear, increment } from '@mail/model/model_field_command';
registerModel({
name: 'EmojiGridView',
recordMethods: {
calculateDimensions() {
if (!this.containerRef.el || !this.viewBlockRef.el) {
return;
}
const fittingAmount = this.containerRef.el.clientHeight / this.rowHeight;
const amountToDisplay = fittingAmount + this.additionalRowsToRender;
this.update({
amountToDisplay,
scrollRecomputeCount: increment()
});
},
doJumpToCategorySelectedByUser() {
this.containerRef.el.scrollTo({
top: this.rowHeight * this.categorySelectedByUser.emojiGridRowView.index,
@@ -64,24 +53,25 @@ registerModel({
},
},
fields: {
additionalRowsToRender: attr({
default: 4,
}),
amountOfItemsPerRow: attr({
default: 9,
}),
amountToDisplay: attr({
default: 50,
}),
categorySelectedByUser: one('EmojiPickerView.Category'),
containerRef: attr(),
/**
* Distance of the rendered rows from top.
* This is from the PoV of 1st rendered row, including extra rendered rows!
*/
distanceFromTop: attr({
compute() {
this.scrollRecomputeCount; // observe scroll changes
if (!this.listRef || !this.listRef.el) {
return clear();
}
return this.scrollPercentage * this.listRef.el.clientHeight;
return Math.max(
(this.scrollPercentage * this.listRef.el.clientHeight - this.extraRenderRowsAmount * this.rowHeight),
0,
);
},
default: 0,
}),
@@ -95,16 +85,20 @@ registerModel({
identifying: true,
inverse: 'emojiGridView',
}),
/**
* Extra rows above and below the visible part.
* 10 means 10 rows above and 10 rows below.
*/
extraRenderRowsAmount: attr({
default: 10,
}),
firstRenderedRowIndex: attr({
compute() {
this.scrollRecomputeCount; // observe scroll changes
let value;
if (this.scrollIndex - this.amountToDisplay >= this.rows.length) {
value = this.scrollIndex - this.amountToDisplay;
} else {
value = this.scrollIndex;
}
return Math.floor(value);
return Math.max(
this.scrollIndex - this.extraRenderRowsAmount,
0,
);
},
default: 0,
}),
@@ -123,12 +117,12 @@ registerModel({
compute() {
this.scrollRecomputeCount; // observe scroll changes
let value;
if (this.firstRenderedRowIndex + this.amountToDisplay >= this.rows.length) {
if (this.firstRenderedRowIndex + this.renderedMaxAmount >= this.rows.length) {
value = Math.max(this.rows.length - 1, 0);
} else {
value = this.firstRenderedRowIndex + this.amountToDisplay;
value = this.firstRenderedRowIndex + this.renderedMaxAmount;
}
return Math.floor(value);
return Math.ceil(value);
},
default: 0,
}),
@@ -149,6 +143,11 @@ registerModel({
},
inverse: 'emojiGridViewAsOnScroll',
}),
renderedMaxAmount: attr({
compute() {
return this.extraRenderRowsAmount * 2 + Math.ceil(this.visibleMaxAmount);
},
}),
renderedRows: many('EmojiGridRowView', {
compute() {
if (this.lastRenderedRowIndex + 1 - this.firstRenderedRowIndex < 0) {
@@ -176,13 +175,19 @@ registerModel({
return this.nonSearchRowRegistry.rows;
},
}),
/**
* Scroll index of the 1st visible rendered rows (so excluding the extra rendered rendered rows).
*/
scrollIndex: attr({
compute() {
this.scrollRecomputeCount; // observe scroll changes
return (this.scrollPercentage * this.rows.length);
return Math.floor(this.scrollPercentage * this.rows.length);
},
default: 0,
}),
/**
* Scroll percentage of the 1st visible rendered rows.
*/
scrollPercentage: attr({
compute() {
this.scrollRecomputeCount; // observe scroll changes
@@ -213,6 +218,14 @@ registerModel({
inverse: 'emojiGridViewOwnerAsSearch',
}),
viewBlockRef: attr(),
/**
* Amount of emoji that are visibly rendered in emoji grid.
* Decimal determines the partial visibility of the last emoji.
* For example, 9.5 means 9 emojis fully visible, and the last is half visible.
*/
visibleMaxAmount: attr({
default: 9.5,
}),
width: attr({
compute() {
return this.itemWidth * this.amountOfItemsPerRow + this.scrollbarThresholdWidth;