diff --git a/addons/web/static/src/views/list/list_arch_parser.js b/addons/web/static/src/views/list/list_arch_parser.js
index f945dcdb423..38f26d9a331 100644
--- a/addons/web/static/src/views/list/list_arch_parser.js
+++ b/addons/web/static/src/views/list/list_arch_parser.js
@@ -10,6 +10,8 @@ import {
} from "@web/views/utils";
import { Field } from "@web/views/fields/field";
import { XMLParser } from "@web/core/utils/xml";
+import { Widget } from "@web/views/widgets/widget";
+import { encodeObjectForTemplate } from "@web/views/view_compiler";
export class GroupListArchParser extends XMLParser {
parse(arch, models, modelName, jsClass) {
@@ -104,6 +106,27 @@ export class ListArchParser extends XMLParser {
});
}
return false;
+ } else if (node.tagName === "widget") {
+ const widgetInfo = Widget.parseWidgetNode(node);
+ addFieldDependencies(
+ activeFields,
+ models[modelName],
+ widgetInfo.WidgetComponent.fieldDependencies
+ );
+
+ const widgetProps = {
+ ...widgetInfo,
+ // FIXME: this is dumb, we encode it into a weird object so that the widget
+ // can decode it later...
+ node: encodeObjectForTemplate({ attrs: widgetInfo.rawAttrs }).slice(1, -1),
+ className: node.getAttribute("class"),
+ };
+ columns.push({
+ ...widgetInfo,
+ props: widgetProps,
+ id: `column_${nextId++}`,
+ type: "widget",
+ });
} else if (node.tagName === "groupby" && node.getAttribute("name")) {
const fieldName = node.getAttribute("name");
const xmlSerializer = new XMLSerializer();
diff --git a/addons/web/static/src/views/list/list_renderer.js b/addons/web/static/src/views/list/list_renderer.js
index abd7ba100b2..aa50bd27eab 100644
--- a/addons/web/static/src/views/list/list_renderer.js
+++ b/addons/web/static/src/views/list/list_renderer.js
@@ -17,6 +17,7 @@ import { getTooltipInfo } from "@web/views/fields/field_tooltip";
import { getClassNameFromDecoration } from "@web/views/utils";
import { ViewButton } from "@web/views/view_button/view_button";
import { useBounceButton } from "@web/views/view_hook";
+import { Widget } from "@web/views/widgets/widget";
const {
Component,
@@ -1747,7 +1748,7 @@ ListRenderer.rowsTemplate = "web.ListRenderer.Rows";
ListRenderer.recordRowTemplate = "web.ListRenderer.RecordRow";
ListRenderer.groupRowTemplate = "web.ListRenderer.GroupRow";
-ListRenderer.components = { DropdownItem, Field, ViewButton, CheckBox, Dropdown, Pager };
+ListRenderer.components = { DropdownItem, Field, ViewButton, CheckBox, Dropdown, Pager, Widget };
ListRenderer.props = [
"activeActions?",
"list",
diff --git a/addons/web/static/src/views/list/list_renderer.xml b/addons/web/static/src/views/list/list_renderer.xml
index 69f3ac37425..f4689a43034 100644
--- a/addons/web/static/src/views/list/list_renderer.xml
+++ b/addons/web/static/src/views/list/list_renderer.xml
@@ -247,6 +247,9 @@
+