diff --git a/addons/spreadsheet/static/src/actions/spreadsheet_download_action.js b/addons/spreadsheet/static/src/actions/spreadsheet_download_action.js index e2199b7fa72..36a3b7729d2 100644 --- a/addons/spreadsheet/static/src/actions/spreadsheet_download_action.js +++ b/addons/spreadsheet/static/src/actions/spreadsheet_download_action.js @@ -4,7 +4,6 @@ import { DataSources } from "@spreadsheet/data_sources/data_sources"; import { migrate } from "@spreadsheet/o_spreadsheet/migration"; import { download } from "@web/core/network/download"; import { registry } from "@web/core/registry"; -import { browser } from "@web/core/browser/browser"; import spreadsheet from "../o_spreadsheet/o_spreadsheet_extended"; import { _t } from "@web/core/l10n/translation"; @@ -14,7 +13,6 @@ async function downloadSpreadsheet(env, action) { const { orm, name, data, stateUpdateMessages } = action.params; const dataSources = new DataSources(orm); const model = new Model(migrate(data), { custom: { dataSources } }, stateUpdateMessages); - await dataSources.waitForAllLoaded(); await waitForDataLoaded(model); const { files } = model.exportXLSX(); await download({ @@ -29,27 +27,34 @@ async function downloadSpreadsheet(env, action) { /** * Ensure that the spreadsheet does not contains cells that are in loading state * @param {Model} model - * @returns {Promise} + * @returns {Promise} */ async function waitForDataLoaded(model) { - model.dispatch("EVALUATE_CELLS"); + const dataSources = model.config.custom.dataSources; return new Promise((resolve, reject) => { - let interval = undefined; - interval = browser.setInterval(() => { - for (const sheetId of model.getters.getSheetIds()) { - for (const cell of Object.values(model.getters.getEvaluatedCells(sheetId))) { - if (cell.type === "error" && cell.error.message === _t("Data is loading")) { - model.dispatch("EVALUATE_CELLS"); - return; - } - } + function check() { + model.dispatch("EVALUATE_CELLS"); + if (isLoaded(model)) { + dataSources.removeEventListener("data-source-updated", check); + resolve(); } - browser.clearInterval(interval); - resolve(); - }, 50); + } + dataSources.addEventListener("data-source-updated", check); + check(); }); } +function isLoaded(model) { + for (const sheetId of model.getters.getSheetIds()) { + for (const cell of Object.values(model.getters.getEvaluatedCells(sheetId))) { + if (cell.type === "error" && cell.error.message === _t("Data is loading")) { + return false; + } + } + } + return true; +} + registry .category("actions") .add("action_download_spreadsheet", downloadSpreadsheet, { force: true });