diff --git a/addons/web/static/src/views/list/list_controller.js b/addons/web/static/src/views/list/list_controller.js
index 505df513114..cbf8a7aa19c 100644
--- a/addons/web/static/src/views/list/list_controller.js
+++ b/addons/web/static/src/views/list/list_controller.js
@@ -61,6 +61,8 @@ export class ListController extends Component {
this.hasMousedownDiscard = false;
this.nextActionAfterMouseup = null;
+ this.optionalActiveFields = [];
+
onWillStart(async () => {
this.isExportEnable = await this.userService.hasGroup("base.group_allow_export");
});
@@ -400,10 +402,15 @@ export class ListController extends Component {
return list.isGrouped ? list.recordCount : list.count;
}
+ onOptionalFieldsChanged(optionalActiveFields) {
+ this.optionalActiveFields = optionalActiveFields;
+ }
+
get defaultExportList() {
return unique(
this.props.archInfo.columns
.filter((col) => col.type === "field")
+ .filter((col) => !col.optional || this.optionalActiveFields[col.name])
.map((col) => this.props.fields[col.name])
.filter((field) => field.exportable !== false)
);
diff --git a/addons/web/static/src/views/list/list_controller.xml b/addons/web/static/src/views/list/list_controller.xml
index 8159a21f5b8..c8059e9543f 100644
--- a/addons/web/static/src/views/list/list_controller.xml
+++ b/addons/web/static/src/views/list/list_controller.xml
@@ -69,7 +69,7 @@
-
+
diff --git a/addons/web/static/src/views/list/list_renderer.js b/addons/web/static/src/views/list/list_renderer.js
index d44ef288ce3..de29dd342a2 100644
--- a/addons/web/static/src/views/list/list_renderer.js
+++ b/addons/web/static/src/views/list/list_renderer.js
@@ -1031,6 +1031,9 @@ export class ListRenderer extends Component {
this.optionalActiveFields[col.name] = col.optional === "show";
}
}
+ if (this.props.onOptionalFieldsChanged) {
+ this.props.onOptionalFieldsChanged(this.optionalActiveFields);
+ }
}
onClickSortColumn(column) {
@@ -1808,6 +1811,9 @@ export class ListRenderer extends Component {
async toggleOptionalField(fieldName) {
this.optionalActiveFields[fieldName] = !this.optionalActiveFields[fieldName];
+ if (this.props.onOptionalFieldsChanged) {
+ this.props.onOptionalFieldsChanged(this.optionalActiveFields);
+ }
this.state.columns = this.getActiveColumns(this.props.list);
this.saveOptionalActiveFields(
this.allColumns.filter((col) => this.optionalActiveFields[col.name] && col.optional)
@@ -2106,6 +2112,7 @@ ListRenderer.props = [
"editable?",
"noContentHelp?",
"nestedKeyOptionalFieldsData?",
+ "onOptionalFieldsChanged?",
];
ListRenderer.defaultProps = { hasSelectors: false, cycleOnTab: true };
diff --git a/addons/web/static/tests/views/view_dialogs/export_data_dialog_tests.js b/addons/web/static/tests/views/view_dialogs/export_data_dialog_tests.js
index e9b920817f3..1a2cd61faff 100644
--- a/addons/web/static/tests/views/view_dialogs/export_data_dialog_tests.js
+++ b/addons/web/static/tests/views/view_dialogs/export_data_dialog_tests.js
@@ -1219,4 +1219,45 @@ QUnit.module("ViewDialogs", (hooks) => {
"subfield has been found with its technical name and is displayed"
);
});
+
+ QUnit.test(
+ "Direct export list take optional fields into account",
+ async function (assert) {
+ assert.expect(3);
+
+ mockDownload(({ url, data }) => {
+ assert.strictEqual(
+ url,
+ "/web/export/xlsx",
+ "should call get_file with the correct url"
+ );
+ assert.deepEqual(JSON.parse(data.data).fields, [
+ { label: "Bar", name: "bar", type: "boolean" },
+ ]);
+ return Promise.resolve();
+ });
+
+ await makeView({
+ serverData,
+ type: "list",
+ resModel: "partner",
+ arch: `
+
+
+
+ `,
+ });
+
+ await click(target, "table .o_optional_columns_dropdown .dropdown-toggle");
+ await click(target, "div.o_optional_columns_dropdown span.dropdown-item:first-child");
+ assert.containsN(
+ target,
+ "th",
+ 3,
+ "should have 3 th, 1 for selector, 1 for columns, 1 for optional columns"
+ );
+
+ await exportAllAction(target);
+ }
+ );
});