From 1f6c655cbc5cf7a127bc0b5444f9fdf07b1443ca Mon Sep 17 00:00:00 2001 From: "Julien Carion (juca)" Date: Wed, 29 Mar 2023 14:00:34 +0000 Subject: [PATCH] [IMP] web, *: Add lazy loading for images in kanban MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds the loading="lazy" attribute to every img tags compiled by the kanban compiler and modifies some kanban archs in order to use img tags instead of divs with background-image style to load images (this allows again the loading="lazy" attribute to work). The purpose is to avoid loading images that are outside the user viewport at all time in order to reduce the load on the network when new images are loaded. Steps to test: find all views that are using the o_kanban_image or o_kanban_image_fill_left class and ensure all the images in these views appear in the network tab of devtools when they enter the user viewport. Example: res.partners, hr.employee, ... task-3102207 closes odoo/odoo#117049 Related: odoo/enterprise#39560 Signed-off-by: Géry Debongnie --- addons/fleet/views/fleet_vehicle_views.xml | 4 +++- .../background_image/background_image.scss | 11 ++++++---- .../background_image/background_image.xml | 7 ++++-- addons/lunch/views/lunch_product_views.xml | 10 +++++---- .../src/views/fields/image/image_field.xml | 1 + .../src/views/kanban/kanban_compiler.js | 12 ++++++++-- .../src/views/kanban/kanban_controller.scss | 22 +++++++++++++++++++ .../static/tests/views/kanban_view_tests.js | 5 +++++ .../views/slide_slide_views.xml | 8 +++---- odoo/addons/base/views/res_partner_views.xml | 15 +++++++++---- 10 files changed, 74 insertions(+), 21 deletions(-) diff --git a/addons/fleet/views/fleet_vehicle_views.xml b/addons/fleet/views/fleet_vehicle_views.xml index 4c643ce8ea1..c88b4b887a8 100644 --- a/addons/fleet/views/fleet_vehicle_views.xml +++ b/addons/fleet/views/fleet_vehicle_views.xml @@ -273,7 +273,9 @@
-
+
+ +
: diff --git a/addons/hr/static/src/components/background_image/background_image.scss b/addons/hr/static/src/components/background_image/background_image.scss index e0a976a4d5e..0d0e0c110b7 100644 --- a/addons/hr/static/src/components/background_image/background_image.scss +++ b/addons/hr/static/src/components/background_image/background_image.scss @@ -1,11 +1,14 @@ div.o_field_widget.o_field_background_image { display: inline-block; - > div { - background-position: center; - background-repeat: no-repeat; - background-size: cover; + > img { + display: block; width: 100%; height: 100%; + object-fit: cover; + object-position: center; + position: absolute; + top: 0; + left: 0; } } diff --git a/addons/hr/static/src/components/background_image/background_image.xml b/addons/hr/static/src/components/background_image/background_image.xml index 1e627e9eb23..c3b38ff5c74 100644 --- a/addons/hr/static/src/components/background_image/background_image.xml +++ b/addons/hr/static/src/components/background_image/background_image.xml @@ -1,10 +1,13 @@ -
+ t-attf-src="#{getUrl(props.previewImage or props.name)}" + alt="Binary file" + /> diff --git a/addons/lunch/views/lunch_product_views.xml b/addons/lunch/views/lunch_product_views.xml index 9befe87ea1e..6af6295fe07 100644 --- a/addons/lunch/views/lunch_product_views.xml +++ b/addons/lunch/views/lunch_product_views.xml @@ -163,8 +163,9 @@
-
+
+ +
@@ -254,8 +255,9 @@
-
+
+ +
diff --git a/addons/web/static/src/views/fields/image/image_field.xml b/addons/web/static/src/views/fields/image/image_field.xml index a6748cc81f5..896f89a06ea 100644 --- a/addons/web/static/src/views/fields/image/image_field.xml +++ b/addons/web/static/src/views/fields/image/image_field.xml @@ -30,6 +30,7 @@
Binary file img:not(.o_kanban_image_inner_pic) { + object-fit: cover; + object-position: center; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + } &.o_kanban_image_full { background-size: contain; + > img { + object-fit: contain; + } } } @@ -194,6 +206,7 @@ // Eg. In partners list we use to fill user picture only, keeping the // default design for company logos. .o_kanban_image { + position: relative; margin-right: var(--KanbanRecord-padding-h); flex: 0 0 var(--KanbanRecord__image-width); min-height: var(--KanbanRecord__image-width); @@ -203,6 +216,15 @@ repeat: no-repeat; position: center; } + > img:not(.o_kanban_image_inner_pic) { + object-fit: cover; + object-position: center; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + } @include media-breakpoint-down(md) { flex-basis: var(--KanbanRecord__image--fill-width); diff --git a/addons/web/static/tests/views/kanban_view_tests.js b/addons/web/static/tests/views/kanban_view_tests.js index a4ad274300f..f6cace3976b 100644 --- a/addons/web/static/tests/views/kanban_view_tests.js +++ b/addons/web/static/tests/views/kanban_view_tests.js @@ -9538,6 +9538,11 @@ QUnit.module("Views", (hooks) => { 'img[data-src*="/web/image"][data-src*="&id=1"]' ); assert.strictEqual(imageOnRecord.length, 1, "partner with image display image by url"); + assert.strictEqual( + imageOnRecord[0].loading, + "lazy", + "img in kanban view should be lazy loaded" + ); }); QUnit.test("test displaying image (write_date field)", async (assert) => { diff --git a/addons/website_slides/views/slide_slide_views.xml b/addons/website_slides/views/slide_slide_views.xml index 944d1c36d1a..cf20ea7b4d8 100644 --- a/addons/website_slides/views/slide_slide_views.xml +++ b/addons/website_slides/views/slide_slide_views.xml @@ -235,14 +235,14 @@ -
+
+
-
+
+ diff --git a/odoo/addons/base/views/res_partner_views.xml b/odoo/addons/base/views/res_partner_views.xml index 76d61994acb..dab87207646 100644 --- a/odoo/addons/base/views/res_partner_views.xml +++ b/odoo/addons/base/views/res_partner_views.xml @@ -481,16 +481,23 @@
- -
+ +
+
-
+
+
-