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); + } + ); });