From 7dd76e39f8ef3e676ffe717e2151be5a33940789 Mon Sep 17 00:00:00 2001 From: Pier-Jean Malandrino Date: Thu, 30 Apr 2026 10:57:46 +0200 Subject: [PATCH] =?UTF-8?q?feat(#240,#241):=20DocInspectTab=20=E2=80=94=20?= =?UTF-8?q?Markdown/Elements/Images=20from=20Docling=20analysis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/features/analysis/api.test.ts | 18 ++- frontend/src/features/analysis/api.ts | 4 + .../analysis/ui/InspectResultTabs.vue | 131 ++++++++++++++++++ frontend/src/pages/DocInspectTab.vue | 119 ++++++++++++++-- frontend/src/shared/i18n.ts | 21 +++ 5 files changed, 281 insertions(+), 12 deletions(-) create mode 100644 frontend/src/features/analysis/ui/InspectResultTabs.vue diff --git a/frontend/src/features/analysis/api.test.ts b/frontend/src/features/analysis/api.test.ts index 720052d..c8476de 100644 --- a/frontend/src/features/analysis/api.test.ts +++ b/frontend/src/features/analysis/api.test.ts @@ -1,5 +1,11 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' -import { createAnalysis, fetchAnalyses, fetchAnalysis, deleteAnalysis } from './api' +import { + createAnalysis, + fetchAnalyses, + fetchAnalysis, + deleteAnalysis, + fetchDocumentAnalyses, +} from './api' vi.mock('../../shared/api/http', () => ({ apiFetch: vi.fn(), @@ -66,4 +72,14 @@ describe('analysis API', () => { expect(apiFetch).toHaveBeenCalledWith('/api/analyses/42', { method: 'DELETE' }) }) + + it('fetchDocumentAnalyses calls GET /api/analyses?documentId=:id', async () => { + const analyses = [{ id: '1', documentId: 'doc-42', status: 'COMPLETED' }] + apiFetch.mockResolvedValue(analyses) + + const result = await fetchDocumentAnalyses('doc-42') + + expect(apiFetch).toHaveBeenCalledWith('/api/analyses?documentId=doc-42') + expect(result).toEqual(analyses) + }) }) diff --git a/frontend/src/features/analysis/api.ts b/frontend/src/features/analysis/api.ts index 97ba65a..63ae0e8 100644 --- a/frontend/src/features/analysis/api.ts +++ b/frontend/src/features/analysis/api.ts @@ -37,3 +37,7 @@ export function fetchAnalysis(id: string): Promise { export function deleteAnalysis(id: string): Promise { return apiFetch(`/api/analyses/${id}`, { method: 'DELETE' }) } + +export function fetchDocumentAnalyses(docId: string): Promise { + return apiFetch(`/api/analyses?documentId=${encodeURIComponent(docId)}`) +} diff --git a/frontend/src/features/analysis/ui/InspectResultTabs.vue b/frontend/src/features/analysis/ui/InspectResultTabs.vue new file mode 100644 index 0000000..99e34b8 --- /dev/null +++ b/frontend/src/features/analysis/ui/InspectResultTabs.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/frontend/src/pages/DocInspectTab.vue b/frontend/src/pages/DocInspectTab.vue index d362340..84020af 100644 --- a/frontend/src/pages/DocInspectTab.vue +++ b/frontend/src/pages/DocInspectTab.vue @@ -1,44 +1,141 @@ diff --git a/frontend/src/shared/i18n.ts b/frontend/src/shared/i18n.ts index 103e777..fec9e06 100644 --- a/frontend/src/shared/i18n.ts +++ b/frontend/src/shared/i18n.ts @@ -361,6 +361,17 @@ const messages: Messages = { 'settings.about': '\u00C0 propos', 'settings.designArticle': 'Comment Docling Studio a \u00e9t\u00e9 con\u00e7u', + // Inspect tab (#240, #241) + 'inspect.tabMarkdown': 'Markdown', + 'inspect.tabElements': '\u00c9l\u00e9ments', + 'inspect.tabImages': 'Images', + 'inspect.noAnalysis': 'Aucune analyse disponible', + 'inspect.noAnalysisSub': 'Analysez ce document dans le Studio pour voir sa structure.', + 'inspect.goToStudio': 'Aller dans le Studio', + 'inspect.retry': 'R\u00e9essayer', + 'inspect.noElements': + 'Aucun \u00e9l\u00e9ment \u2014 lancez une analyse pour g\u00e9n\u00e9rer la structure.', + // Doc workspace (#216, #218) 'workspace.tabs.ask': 'Ask', 'workspace.tabs.inspect': 'Inspect', @@ -758,6 +769,16 @@ const messages: Messages = { 'settings.about': 'About', 'settings.designArticle': 'How Docling Studio was designed', + // Inspect tab (#240, #241) + 'inspect.tabMarkdown': 'Markdown', + 'inspect.tabElements': 'Elements', + 'inspect.tabImages': 'Images', + 'inspect.noAnalysis': 'No analysis available', + 'inspect.noAnalysisSub': 'Analyze this document in Studio to see its structure.', + 'inspect.goToStudio': 'Go to Studio', + 'inspect.retry': 'Retry', + 'inspect.noElements': 'No elements — run an analysis to generate structure.', + // Doc workspace (#216, #218) 'workspace.tabs.ask': 'Ask', 'workspace.tabs.inspect': 'Inspect',