From 31c894ee65ef2d9017daabeaf8deec99325e1c03 Mon Sep 17 00:00:00 2001 From: Sergey Kozyrenko Date: Fri, 15 May 2026 11:52:02 +0700 Subject: [PATCH] refactor(frontend): move report module from lib/ to features/report/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The PDF generator (~658 lines, lazy-loaded) and its public-API wrapper report.ts are functionally one module. They now live together in features/report/ instead of being scattered in lib/, which was a poor home for a 658-line React-pdf component anyway. The lazy-import path inside report.ts stays relative (./report-pdf), and the four consumers (flow.tsx, flow-files.tsx, flow-report.tsx, resources.tsx) just swap '@/lib/report' for '@/features/report'. Note: copyToClipboard and downloadTextFile come along for the ride — they're generic helpers used in non-report contexts too. Splitting them out cleanly into lib/ would be worth a follow-up if you want stricter domain boundaries. --- frontend/src/features/flows/files/flow-files.tsx | 2 +- frontend/src/features/report/index.ts | 8 ++++++++ frontend/src/{lib => features/report}/report-pdf.tsx | 2 +- frontend/src/{lib => features/report}/report.ts | 3 +-- frontend/src/pages/flows/flow-report.tsx | 2 +- frontend/src/pages/flows/flow.tsx | 2 +- frontend/src/pages/resources/resources.tsx | 2 +- 7 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 frontend/src/features/report/index.ts rename frontend/src/{lib => features/report}/report-pdf.tsx (99%) rename frontend/src/{lib => features/report}/report.ts (99%) diff --git a/frontend/src/features/flows/files/flow-files.tsx b/frontend/src/features/flows/files/flow-files.tsx index cb7f6185..c5b27913 100644 --- a/frontend/src/features/flows/files/flow-files.tsx +++ b/frontend/src/features/flows/files/flow-files.tsx @@ -21,9 +21,9 @@ import { Empty, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from '@/ import { Form, FormControl, FormField, FormItem } from '@/components/ui/form'; import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from '@/components/ui/input-group'; import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; +import { copyToClipboard } from '@/features/report'; import { StatusType } from '@/graphql/types'; import { useFilesDragAndDrop } from '@/hooks/use-files-drag-and-drop'; -import { copyToClipboard } from '@/lib/report'; import { useFlow } from '@/providers/flow-provider'; import { FlowFilesAttachResourcesDialog } from './flow-files-attach-resources-dialog'; diff --git a/frontend/src/features/report/index.ts b/frontend/src/features/report/index.ts new file mode 100644 index 00000000..cc75780c --- /dev/null +++ b/frontend/src/features/report/index.ts @@ -0,0 +1,8 @@ +export { + copyToClipboard, + downloadTextFile, + generateFileName, + generatePDFBlob, + generatePDFFromMarkdown, + generateReport, +} from './report'; diff --git a/frontend/src/lib/report-pdf.tsx b/frontend/src/features/report/report-pdf.tsx similarity index 99% rename from frontend/src/lib/report-pdf.tsx rename to frontend/src/features/report/report-pdf.tsx index d66de790..b0f3dba3 100644 --- a/frontend/src/lib/report-pdf.tsx +++ b/frontend/src/features/report/report-pdf.tsx @@ -1,7 +1,7 @@ import { Document, Font, Page, pdf, StyleSheet, Text, View } from '@react-pdf/renderer'; import { marked } from 'marked'; -import { Log } from './log'; +import { Log } from '@/lib/log'; // Register Noto Sans (covers Latin + Cyrillic + Greek + many other scripts) Font.register({ diff --git a/frontend/src/lib/report.ts b/frontend/src/features/report/report.ts similarity index 99% rename from frontend/src/lib/report.ts rename to frontend/src/features/report/report.ts index 0a16e58f..2b56ba3f 100644 --- a/frontend/src/lib/report.ts +++ b/frontend/src/features/report/report.ts @@ -3,8 +3,7 @@ import GithubSlugger from 'github-slugger'; import type { FlowFragmentFragment, TaskFragmentFragment } from '@/graphql/types'; import { StatusType } from '@/graphql/types'; - -import { Log } from './log'; +import { Log } from '@/lib/log'; // Helper function to get emoji for status const getStatusEmoji = (status: StatusType): string => { diff --git a/frontend/src/pages/flows/flow-report.tsx b/frontend/src/pages/flows/flow-report.tsx index a86e5922..a72cebf2 100644 --- a/frontend/src/pages/flows/flow-report.tsx +++ b/frontend/src/pages/flows/flow-report.tsx @@ -3,9 +3,9 @@ import { useParams, useSearchParams } from 'react-router-dom'; import Logo from '@/components/icons/logo'; import Markdown from '@/components/shared/markdown'; +import { generateFileName, generatePDFFromMarkdown, generateReport } from '@/features/report'; import { useFlowReportQuery } from '@/graphql/types'; import { Log } from '@/lib/log'; -import { generateFileName, generatePDFFromMarkdown, generateReport } from '@/lib/report'; type PdfPhase = 'done' | 'error' | 'idle'; type ReportState = 'content' | 'error' | 'generating' | 'loading'; diff --git a/frontend/src/pages/flows/flow.tsx b/frontend/src/pages/flows/flow.tsx index 3037a9a0..01ed969b 100644 --- a/frontend/src/pages/flows/flow.tsx +++ b/frontend/src/pages/flows/flow.tsx @@ -40,11 +40,11 @@ import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip import FlowCentralTabs from '@/features/flows/flow-central-tabs'; import FlowTabs from '@/features/flows/flow-tabs'; import { useFlowDetailNavigation } from '@/features/flows/use-flow-detail-navigation'; +import { copyToClipboard, downloadTextFile, generateFileName, generateReport } from '@/features/report'; import { ResultType, StatusType, useRenameFlowMutation } from '@/graphql/types'; import { useBreakpoint } from '@/hooks/use-breakpoint'; import { useFlowTabDetection } from '@/hooks/use-flow-tab-detection'; import { Log } from '@/lib/log'; -import { copyToClipboard, downloadTextFile, generateFileName, generateReport } from '@/lib/report'; import { formatName } from '@/lib/utils/format'; import { useFavorites } from '@/providers/favorites-provider'; import { useFlow } from '@/providers/flow-provider'; diff --git a/frontend/src/pages/resources/resources.tsx b/frontend/src/pages/resources/resources.tsx index aa14b002..ef9dbaa7 100644 --- a/frontend/src/pages/resources/resources.tsx +++ b/frontend/src/pages/resources/resources.tsx @@ -39,6 +39,7 @@ import { FileDropZone } from '@/components/ui/file-drop-zone'; import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from '@/components/ui/input-group'; import { Separator } from '@/components/ui/separator'; import { SidebarTrigger } from '@/components/ui/sidebar'; +import { copyToClipboard } from '@/features/report'; import { ResourcesCopyDialog } from '@/features/resources/resources-copy-dialog'; import { ResourcesMkdirDialog } from '@/features/resources/resources-mkdir-dialog'; import { ResourcesMoveDialog } from '@/features/resources/resources-move-dialog'; @@ -50,7 +51,6 @@ import { useResourcesUpload } from '@/features/resources/use-resources-upload'; import { useEffectAfterMount } from '@/hooks/use-effect-after-mount'; import { useFilesDragAndDrop } from '@/hooks/use-files-drag-and-drop'; import { usePageStorageKeys } from '@/hooks/use-page-storage-keys'; -import { copyToClipboard } from '@/lib/report'; import { migrateLegacyViewOptions, saveViewOptions } from '@/lib/view-options-storage'; import { useResources } from '@/providers/resources-provider';