From d095d12ed7d9021741912dfe1d6bf206ed9e5f9c Mon Sep 17 00:00:00 2001 From: Ronan Lenouvel Date: Wed, 30 Sep 2026 16:18:42 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(takeout):=20pr=C3=A9cise=20q?= =?UTF-8?q?ue=20le=20serveur=20travaille=20dans=20la=20liste=20des=20impor?= =?UTF-8?q?ts=20actifs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La liste des imports en attente/en cours (rendue au chargement de la page) n'indiquait rien sur le fait qu'un import scheduled/extracting/processing tourne déjà côté serveur — seul le bloc affiché juste après avoir démarré soi-même un upload avait ce message rassurant (#482). --- .../controllers/takeout_import_controller.js | 14 +++++++ .../tests/takeout-import-controller.test.js | 39 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/assets/controllers/takeout_import_controller.js b/assets/controllers/takeout_import_controller.js index b2e00434..1c62c65b 100644 --- a/assets/controllers/takeout_import_controller.js +++ b/assets/controllers/takeout_import_controller.js @@ -139,6 +139,20 @@ export default class extends Controller { header.appendChild(actions); li.appendChild(header); + // Constaté en conditions réelles le 2026-09-30 : au rechargement de + // la page pendant qu'un import tourne déjà côté serveur, rien + // n'indiquait qu'il s'agit d'un traitement serveur (pas d'un upload + // en attente de l'utilisateur) et que la page peut être quittée sans + // risque — seul le bloc "progress" affiché juste après avoir + // soi-même démarré un upload avait ce message (#482). + if (['scheduled', 'extracting', 'processing'].includes(pendingImport.status)) { + const safeToCloseMessage = document.createElement('p'); + safeToCloseMessage.className = 'text-xs'; + safeToCloseMessage.style.color = 'var(--hc-text-secondary, var(--hc-text))'; + safeToCloseMessage.textContent = 'Le serveur travaille : vous pouvez quitter cette page, l\'import continue en arrière-plan.'; + li.appendChild(safeToCloseMessage); + } + if (pendingImport.status === 'extracting' && pendingImport.zipsProgress?.length) { const zipsList = document.createElement('ul'); zipsList.className = 'flex flex-col gap-2'; diff --git a/assets/tests/takeout-import-controller.test.js b/assets/tests/takeout-import-controller.test.js index b127209f..9d75fa81 100644 --- a/assets/tests/takeout-import-controller.test.js +++ b/assets/tests/takeout-import-controller.test.js @@ -634,4 +634,43 @@ describe('liste des imports Takeout en attente (#481)', () => { const items = document.querySelectorAll('[data-takeout-import-target="pendingList"] li'); expect(items).toHaveLength(0); }); + + // Constaté en conditions réelles le 2026-09-30 : au rechargement de la + // page pendant qu'un import tourne déjà côté serveur (extracting, + // processing, scheduled), rien n'indique à l'utilisateur qu'il peut + // quitter la page — ce message n'existait que dans le bloc "progress" + // affiché juste après avoir soi-même démarré un upload (#482), pas dans + // la liste des imports actifs rendue au chargement. + test.each(['scheduled', 'extracting', 'processing'])( + 'indique que le serveur travaille et qu\'on peut quitter la page (%s)', + async (status) => { + html(); + global.fetch = jest.fn().mockResolvedValueOnce({ + ok: true, + json: async () => [{ id: 'import-1', status, createdAt: '2026-09-20T10:00:00+00:00', filesUploadedCount: 3 }], + }); + + application = Application.start(); + application.register('takeout-import', TakeoutImportController); + await new Promise((resolve) => setTimeout(resolve, 0)); + + const item = document.querySelector('[data-takeout-import-target="pendingList"] li'); + expect(item.textContent).toMatch(/quitter cette page/i); + }, + ); + + test('n\'affiche pas le message serveur pour un import pending (upload pas terminé)', async () => { + html(); + global.fetch = jest.fn().mockResolvedValueOnce({ + ok: true, + json: async () => [{ id: 'import-1', status: 'pending', createdAt: '2026-09-20T10:00:00+00:00', filesUploadedCount: 1 }], + }); + + application = Application.start(); + application.register('takeout-import', TakeoutImportController); + await new Promise((resolve) => setTimeout(resolve, 0)); + + const item = document.querySelector('[data-takeout-import-target="pendingList"] li'); + expect(item.textContent).not.toMatch(/quitter cette page/i); + }); });