@cannyminds/dms-file-viewers 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-3STHCDAC.js +1402 -0
- package/dist/chunk-3STHCDAC.js.map +1 -0
- package/dist/chunk-4RL77HKO.js +196 -0
- package/dist/chunk-4RL77HKO.js.map +1 -0
- package/dist/chunk-73ZIFR3P.mjs +1402 -0
- package/dist/chunk-73ZIFR3P.mjs.map +1 -0
- package/dist/chunk-7JTIG6OU.js +177 -0
- package/dist/chunk-7JTIG6OU.js.map +1 -0
- package/dist/chunk-BNHQYEZ7.js +448 -0
- package/dist/chunk-BNHQYEZ7.js.map +1 -0
- package/dist/chunk-EMP7RZM2.js +159 -0
- package/dist/chunk-EMP7RZM2.js.map +1 -0
- package/dist/chunk-FZYMVHF6.mjs +159 -0
- package/dist/chunk-FZYMVHF6.mjs.map +1 -0
- package/dist/chunk-GNWU6XHH.js +288 -0
- package/dist/chunk-GNWU6XHH.js.map +1 -0
- package/dist/chunk-LKBM4O47.mjs +177 -0
- package/dist/chunk-LKBM4O47.mjs.map +1 -0
- package/dist/chunk-NOLXOOIP.mjs +448 -0
- package/dist/chunk-NOLXOOIP.mjs.map +1 -0
- package/dist/chunk-QLJKOQTP.mjs +78 -0
- package/dist/chunk-QLJKOQTP.mjs.map +1 -0
- package/dist/chunk-QQDQJ7TS.mjs +263 -0
- package/dist/chunk-QQDQJ7TS.mjs.map +1 -0
- package/dist/chunk-QRYIHDRT.mjs +196 -0
- package/dist/chunk-QRYIHDRT.mjs.map +1 -0
- package/dist/chunk-RE4XRGSV.js +263 -0
- package/dist/chunk-RE4XRGSV.js.map +1 -0
- package/dist/chunk-XQBXRMB7.mjs +288 -0
- package/dist/chunk-XQBXRMB7.mjs.map +1 -0
- package/dist/chunk-Z7FUO5RX.js +78 -0
- package/dist/chunk-Z7FUO5RX.js.map +1 -0
- package/dist/components/viewers/AudioViewer.js +9 -0
- package/dist/components/viewers/AudioViewer.js.map +1 -0
- package/dist/components/viewers/AudioViewer.mjs +9 -0
- package/dist/components/viewers/AudioViewer.mjs.map +1 -0
- package/dist/components/viewers/DefaultViewer.js +8 -0
- package/dist/components/viewers/DefaultViewer.js.map +1 -0
- package/dist/components/viewers/DefaultViewer.mjs +8 -0
- package/dist/components/viewers/DefaultViewer.mjs.map +1 -0
- package/dist/components/viewers/ImageViewer.js +10 -0
- package/dist/components/viewers/ImageViewer.js.map +1 -0
- package/dist/components/viewers/ImageViewer.mjs +10 -0
- package/dist/components/viewers/ImageViewer.mjs.map +1 -0
- package/dist/components/viewers/PDFViewer.js +9 -0
- package/dist/components/viewers/PDFViewer.js.map +1 -0
- package/dist/components/viewers/PDFViewer.mjs +9 -0
- package/dist/components/viewers/PDFViewer.mjs.map +1 -0
- package/dist/components/viewers/TIFFViewer.js +9 -0
- package/dist/components/viewers/TIFFViewer.js.map +1 -0
- package/dist/components/viewers/TIFFViewer.mjs +9 -0
- package/dist/components/viewers/TIFFViewer.mjs.map +1 -0
- package/dist/components/viewers/TextViewer.js +9 -0
- package/dist/components/viewers/TextViewer.js.map +1 -0
- package/dist/components/viewers/TextViewer.mjs +9 -0
- package/dist/components/viewers/TextViewer.mjs.map +1 -0
- package/dist/components/viewers/VideoViewer.js +9 -0
- package/dist/components/viewers/VideoViewer.js.map +1 -0
- package/dist/components/viewers/VideoViewer.mjs +9 -0
- package/dist/components/viewers/VideoViewer.mjs.map +1 -0
- package/dist/index.js +284 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +284 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/viewers/PDFViewer.tsx","../src/components/viewers/pdf/SearchSidebar.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState, forwardRef, useImperativeHandle } from 'react';\r\nimport { PDFViewer as HeadlessPDFViewer } from '@cannyminds/pdf-viewer';\r\nimport { FileViewerProps } from '../../types';\r\nimport { getFileExtension } from '../../utils/fileUtils';\r\nimport FileIcon from '../FileIcon';\r\nimport FirstPageIcon from '@mui/icons-material/FirstPage';\r\nimport LastPageIcon from '@mui/icons-material/LastPage';\r\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\r\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\r\nimport ZoomInIcon from '@mui/icons-material/ZoomIn';\r\nimport ZoomOutIcon from '@mui/icons-material/ZoomOut';\r\nimport FitScreenIcon from '@mui/icons-material/FitScreen';\r\nimport AspectRatioIcon from '@mui/icons-material/AspectRatio';\r\nimport SearchIcon from '@mui/icons-material/Search';\r\nimport DownloadIcon from '@mui/icons-material/Download';\r\nimport PrintIcon from '@mui/icons-material/Print';\r\nimport InfoIcon from '@mui/icons-material/Info';\r\nimport DescriptionIcon from '@mui/icons-material/Description';\r\nimport { SearchSidebar } from './pdf/SearchSidebar';\r\n\r\ntype LoadingState = 'idle' | 'loading' | 'ready' | 'error';\r\n\r\n/**\r\n * IMPORTANT: The @cannyminds/pdf-viewer navigation API is not fully implemented.\r\n * Methods like getCurrentPage(), getTotalPages(), goToPage() return hardcoded values.\r\n * This component implements custom page tracking using DOM inspection and search detection.\r\n */\r\n\r\n// ============================================================================\r\n// Toolbar Styles\r\n// ============================================================================\r\nconst toolbarStyles = `\r\n @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+Tamil:wght@400;500;600;700&family=Noto+Sans+Devanagari:wght@400;500;600;700&display=swap');\r\n \r\n * {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\r\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\r\n 'Noto Sans Tamil', 'Noto Sans Devanagari', 'Lohit Tamil', 'Tamil MN', \r\n 'Arial Unicode MS', sans-serif !important;\r\n }\r\n \r\n /* Target PDF.js text layer */\r\n .textLayer,\r\n .textLayer span,\r\n .textLayer div,\r\n [class*=\"pdf\"],\r\n [class*=\"page\"],\r\n canvas + div,\r\n .embedpdf-viewport *,\r\n [data-pdf-viewer] *,\r\n [role=\"document\"] * {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\r\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\r\n 'Noto Sans Tamil', 'Noto Sans Devanagari', 'Lohit Tamil', 'Tamil MN', \r\n 'Arial Unicode MS', sans-serif !important;\r\n }\r\n \r\n .pdf-viewer-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 8px;\r\n padding: 3px 16px 0 16px;\r\n background: #fff;\r\n min-height: 36px;\r\n }\r\n .header-file-name {\r\n font-size: 12px;\r\n font-weight: 500;\r\n color: #424242;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n max-width: 400px;\r\n }\r\n .pdf-viewer-toolbar {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 0 16px 6px 16px;\r\n background: #fff;\r\n gap: 12px;\r\n flex-wrap: wrap;\r\n min-height: 44px;\r\n }\r\n .toolbar-section {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n }\r\n .toolbar-separator {\r\n width: 1px;\r\n height: 24px;\r\n background: #e0e0e0;\r\n margin: 0 4px;\r\n }\r\n .toolbar-button {\r\n padding: 8px;\r\n border: none;\r\n background: transparent;\r\n cursor: pointer;\r\n border-radius: 4px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: background 0.2s;\r\n }\r\n .toolbar-button:hover:not(:disabled) {\r\n background: #f5f5f5;\r\n }\r\n .toolbar-button:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n .toolbar-button svg {\r\n width: 20px;\r\n height: 20px;\r\n display: block;\r\n }\r\n .page-input {\r\n width: 60px;\r\n padding: 4px 8px;\r\n border: 1px solid #e0e0e0;\r\n border-radius: 4px;\r\n text-align: center;\r\n font-size: 14px;\r\n }\r\n .page-info {\r\n font-size: 14px;\r\n color: #666;\r\n white-space: nowrap;\r\n }\r\n .zoom-display {\r\n min-width: 60px;\r\n text-align: center;\r\n font-size: 14px;\r\n color: #666;\r\n }\r\n .search-input {\r\n padding: 4px 8px;\r\n border: 1px solid #e0e0e0;\r\n border-radius: 4px;\r\n font-size: 14px;\r\n min-width: 200px;\r\n }\r\n .pdf-viewer-content {\r\n flex: 1;\r\n overflow: hidden;\r\n position: relative;\r\n user-select: text;\r\n -webkit-user-select: text;\r\n -moz-user-select: text;\r\n -ms-user-select: text;\r\n }\r\n .pdf-viewer-container {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n width: 100%;\r\n }\r\n .pdf-viewer-main {\r\n display: flex;\r\n flex: 1;\r\n overflow: hidden;\r\n position: relative;\r\n }\r\n .pdf-viewer-viewer-area {\r\n flex: 1;\r\n overflow: hidden;\r\n position: relative;\r\n user-select: text;\r\n -webkit-user-select: text;\r\n -moz-user-select: text;\r\n -ms-user-select: text;\r\n }\r\n .pdf-viewer-viewer-area * {\r\n user-select: text !important;\r\n -webkit-user-select: text !important;\r\n -moz-user-select: text !important;\r\n -ms-user-select: text !important;\r\n }\r\n`;\r\n\r\n// Define the PDFViewerRef interface matching the upstream library\r\ninterface CannyMindsPDFViewerRef {\r\n zoom: {\r\n zoomIn: () => void;\r\n zoomOut: () => void;\r\n setZoom: (level: number) => void;\r\n resetZoom: () => void;\r\n getZoom: () => number | any;\r\n fitToWidth: () => void;\r\n fitToPage: () => void;\r\n };\r\n navigation: {\r\n goToPage: (page: number) => void;\r\n getCurrentPage: () => number;\r\n getTotalPages: () => number;\r\n nextPage: () => void;\r\n previousPage: () => void;\r\n goToFirstPage: () => void;\r\n goToLastPage: () => void;\r\n };\r\n selection: {\r\n clearSelection: () => void;\r\n getSelectedText: () => string;\r\n };\r\n search: {\r\n searchText: (keyword: string) => Promise<any>;\r\n nextResult: () => number;\r\n previousResult: () => number;\r\n goToResult: (index: number) => number;\r\n stopSearch: () => void;\r\n startSearch: () => void;\r\n getSearchState: () => any;\r\n setShowAllResults: (show: boolean) => void;\r\n };\r\n document?: {\r\n isReady: () => boolean;\r\n isLoading: () => boolean;\r\n hasPassword: () => boolean;\r\n getDocumentInfo: () => any;\r\n };\r\n scroll?: {\r\n scrollToPage: (page: number) => void;\r\n };\r\n}\r\n\r\ninterface PDFViewerContentProps extends FileViewerProps {\r\n sourceDescription: string;\r\n}\r\n\r\nexport interface PDFViewerMethods {\r\n zoomIn: () => void;\r\n zoomOut: () => void;\r\n setZoom: (level: number) => void;\r\n resetZoom: () => void;\r\n getZoom: () => number;\r\n goToPage: (page: number) => void;\r\n getCurrentPage: () => number;\r\n getTotalPages: () => number;\r\n nextPage: () => void;\r\n previousPage: () => void;\r\n goToFirstPage: () => void;\r\n goToLastPage: () => void;\r\n searchText: (keyword: string) => Promise<any>;\r\n nextResult: () => number;\r\n previousResult: () => number;\r\n goToResult: (index: number) => number;\r\n stopSearch: () => void;\r\n getSearchState: () => any;\r\n getSelectedText: () => string;\r\n clearSelection: () => void;\r\n}\r\n\r\nconst PDFViewerContent = forwardRef<PDFViewerMethods, PDFViewerContentProps>((props, ref) => {\r\n const { \r\n file, \r\n onLoad, \r\n onError, \r\n fileName, \r\n showPageCount = true,\r\n showPageNavigation = true,\r\n showZoomControls = true,\r\n showDownload = true,\r\n showPrint = true,\r\n showSearch = true,\r\n showMetadata = true,\r\n showProperties = true,\r\n onMetadataClick,\r\n onPropertiesClick,\r\n onDownloadClick,\r\n onPrintClick\r\n } = props;\r\n const [pdfBuffer, setPdfBuffer] = useState<ArrayBuffer | null>(null);\r\n const [state, setState] = useState<LoadingState>('idle');\r\n const [error, setError] = useState<string | null>(null);\r\n const pdfViewerRef = useRef<CannyMindsPDFViewerRef>(null);\r\n \r\n // File info\r\n const resolvedFileName = useMemo(() => {\r\n if (fileName) return fileName;\r\n if (file instanceof File) return file.name;\r\n if (typeof file === 'string') {\r\n const urlParts = file.split('/');\r\n return urlParts[urlParts.length - 1] || 'document.pdf';\r\n }\r\n return 'document.pdf';\r\n }, [file, fileName]);\r\n\r\n const fileExtension = useMemo(\r\n () => getFileExtension(resolvedFileName),\r\n [resolvedFileName]\r\n );\r\n \r\n // Toolbar state\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [totalPages, setTotalPages] = useState(0);\r\n const [zoom, setZoom] = useState(100);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [isSearching, setIsSearching] = useState(false);\r\n const [pdfContainer, setPdfContainer] = useState<HTMLElement | null>(null);\r\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\r\n const [searchResults, setSearchResults] = useState<any[]>([]);\r\n const [currentSearchResultIndex, setCurrentSearchResultIndex] = useState(0);\r\n const [totalSearchResults, setTotalSearchResults] = useState(0);\r\n\r\n // Reset all state when file changes\r\n useEffect(() => {\r\n // Reset search state\r\n setSearchQuery('');\r\n setSearchResults([]);\r\n setCurrentSearchResultIndex(0);\r\n setTotalSearchResults(0);\r\n setIsSearching(false);\r\n setIsSidebarOpen(false);\r\n \r\n // Reset page state\r\n setCurrentPage(1);\r\n setTotalPages(0);\r\n setZoom(100);\r\n \r\n // Reset PDF state\r\n setState('idle');\r\n setError(null);\r\n setPdfBuffer(null);\r\n }, [file]);\r\n\r\n // Track the PDF container for page detection\r\n useEffect(() => {\r\n if (state === 'ready') {\r\n // Find the PDF container after a short delay\r\n setTimeout(() => {\r\n const container = document.querySelector('[data-pdf-viewer], .embedpdf-viewport, [role=\"document\"]') as HTMLElement;\r\n if (container) {\r\n setPdfContainer(container);\r\n }\r\n }, 500);\r\n }\r\n }, [state]);\r\n\r\n // Initialize page count after PDF loads - using DOM-based detection\r\n useEffect(() => {\r\n if (state === 'ready' && totalPages === 0) {\r\n const initializePageCount = async () => {\r\n // Wait for viewer ref to be set and pages to render\r\n let viewer = pdfViewerRef.current;\r\n let retries = 0;\r\n \r\n // Retry getting the viewer ref up to 10 times (5 seconds total)\r\n while (!viewer && retries < 10) {\r\n await new Promise(resolve => setTimeout(resolve, 500));\r\n viewer = pdfViewerRef.current;\r\n retries++;\r\n }\r\n \r\n if (!viewer) return;\r\n\r\n // Wait additional time for pages to render\r\n await new Promise(resolve => setTimeout(resolve, 1500));\r\n\r\n // Method 1: Try the navigation API (even though it's broken)\r\n try {\r\n let count = viewer.navigation?.getTotalPages?.();\r\n \r\n if (count && count > 1) {\r\n setTotalPages(count);\r\n return;\r\n }\r\n } catch (e) {\r\n // Silent fail\r\n }\r\n\r\n // Method 2: Search for common character and count unique pages\r\n try {\r\n const results = await viewer.search?.searchText?.('e');\r\n \r\n if (results?.results && results.results.length > 0) {\r\n const pageIndices = results.results.map((m: any) => m.pageIndex as number).filter((idx: any): idx is number => typeof idx === 'number');\r\n const count = Math.max(...pageIndices) + 1;\r\n viewer.search?.stopSearch?.();\r\n setTotalPages(count);\r\n return;\r\n }\r\n } catch (error) {\r\n // Silent fail\r\n }\r\n\r\n // Method 3: DOM inspection - count rendered pages\r\n try {\r\n await new Promise(resolve => setTimeout(resolve, 1000));\r\n \r\n const selectors = [\r\n '[data-page-index]',\r\n '[data-page-number]',\r\n '.embedpdf-page',\r\n '[role=\"article\"]',\r\n 'canvas[data-page]',\r\n '.react-pdf__Page'\r\n ];\r\n \r\n let pages: NodeListOf<Element> | null = null;\r\n for (const selector of selectors) {\r\n pages = document.querySelectorAll(selector);\r\n if (pages.length > 0) break;\r\n }\r\n \r\n if (pages && pages.length > 0) {\r\n setTotalPages(pages.length);\r\n return;\r\n }\r\n } catch (error) {\r\n // Silent fail\r\n }\r\n\r\n // Method 4: Ultimate fallback\r\n setTotalPages(1);\r\n };\r\n\r\n initializePageCount();\r\n }\r\n }, [state, totalPages]);\r\n\r\n // Update page info and search state periodically\r\n useEffect(() => {\r\n if (state === 'ready' && pdfViewerRef.current) {\r\n const updateInfo = () => {\r\n const current = pdfViewerRef.current?.navigation.getCurrentPage() || 1;\r\n const total = pdfViewerRef.current?.navigation.getTotalPages() || 0;\r\n const zoomValue = pdfViewerRef.current?.zoom.getZoom();\r\n const currentSearchState = pdfViewerRef.current?.search.getSearchState();\r\n \r\n setCurrentPage(current);\r\n \r\n // Update total pages if we got a valid count\r\n if (total > 0 && total !== totalPages) {\r\n setTotalPages(total);\r\n }\r\n \r\n if (typeof zoomValue === 'number') {\r\n setZoom(Math.round(zoomValue * 100));\r\n }\r\n };\r\n\r\n updateInfo();\r\n const interval = setInterval(updateInfo, 300);\r\n return () => clearInterval(interval);\r\n }\r\n }, [state, totalPages]);\r\n\r\n // Expose methods through ref\r\n useImperativeHandle(ref, () => ({\r\n zoomIn: () => {\r\n pdfViewerRef.current?.zoom.zoomIn();\r\n updateZoomDisplay();\r\n },\r\n zoomOut: () => {\r\n pdfViewerRef.current?.zoom.zoomOut();\r\n updateZoomDisplay();\r\n },\r\n setZoom: (level: number) => {\r\n pdfViewerRef.current?.zoom.setZoom(level);\r\n updateZoomDisplay();\r\n },\r\n resetZoom: () => {\r\n pdfViewerRef.current?.zoom.resetZoom();\r\n updateZoomDisplay();\r\n },\r\n getZoom: () => {\r\n const zoom = pdfViewerRef.current?.zoom.getZoom();\r\n return typeof zoom === 'number' ? zoom : 1.0;\r\n },\r\n goToPage: (page: number) => {\r\n pdfViewerRef.current?.navigation.goToPage(page);\r\n setCurrentPage(page);\r\n },\r\n getCurrentPage: () => pdfViewerRef.current?.navigation.getCurrentPage() || 1,\r\n getTotalPages: () => pdfViewerRef.current?.navigation.getTotalPages() || 0,\r\n nextPage: () => {\r\n pdfViewerRef.current?.navigation.nextPage();\r\n updatePageDisplay();\r\n },\r\n previousPage: () => {\r\n pdfViewerRef.current?.navigation.previousPage();\r\n updatePageDisplay();\r\n },\r\n goToFirstPage: () => {\r\n pdfViewerRef.current?.navigation.goToFirstPage();\r\n updatePageDisplay();\r\n },\r\n goToLastPage: () => {\r\n pdfViewerRef.current?.navigation.goToLastPage();\r\n updatePageDisplay();\r\n },\r\n searchText: async (keyword: string) => {\r\n setIsSearching(true);\r\n const results = await pdfViewerRef.current?.search.searchText(keyword);\r\n setIsSearching(false);\r\n setSearchQuery(keyword);\r\n // Search state will be updated by the interval\r\n return results;\r\n },\r\n nextResult: () => {\r\n const index = pdfViewerRef.current?.search.nextResult() || -1;\r\n return index;\r\n },\r\n previousResult: () => {\r\n const index = pdfViewerRef.current?.search.previousResult() || -1;\r\n return index;\r\n },\r\n goToResult: (index: number) => pdfViewerRef.current?.search.goToResult(index) || -1,\r\n stopSearch: () => {\r\n pdfViewerRef.current?.search.stopSearch();\r\n setSearchQuery('');\r\n },\r\n getSearchState: () => pdfViewerRef.current?.search.getSearchState() || null,\r\n getSelectedText: () => pdfViewerRef.current?.selection.getSelectedText() || '',\r\n clearSelection: () => pdfViewerRef.current?.selection.clearSelection(),\r\n }), []);\r\n\r\n const updatePageDisplay = () => {\r\n setTimeout(() => {\r\n const current = pdfViewerRef.current?.navigation.getCurrentPage() || 1;\r\n setCurrentPage(current);\r\n }, 100);\r\n };\r\n\r\n const updateZoomDisplay = () => {\r\n setTimeout(() => {\r\n const zoomValue = pdfViewerRef.current?.zoom.getZoom();\r\n if (typeof zoomValue === 'number') {\r\n setZoom(Math.round(zoomValue * 100));\r\n }\r\n }, 100);\r\n };\r\n\r\n // Toolbar handlers\r\n const handleZoomIn = () => {\r\n pdfViewerRef.current?.zoom.zoomIn();\r\n updateZoomDisplay();\r\n };\r\n\r\n const handleZoomOut = () => {\r\n pdfViewerRef.current?.zoom.zoomOut();\r\n updateZoomDisplay();\r\n };\r\n\r\n const handleFitToWidth = () => {\r\n pdfViewerRef.current?.zoom.fitToWidth();\r\n updateZoomDisplay();\r\n };\r\n\r\n const handleFitToPage = () => {\r\n pdfViewerRef.current?.zoom.fitToPage();\r\n updateZoomDisplay();\r\n };\r\n\r\n const handlePreviousPage = () => {\r\n pdfViewerRef.current?.navigation.previousPage();\r\n updatePageDisplay();\r\n };\r\n\r\n const handleNextPage = () => {\r\n pdfViewerRef.current?.navigation.nextPage();\r\n updatePageDisplay();\r\n };\r\n\r\n const handleFirstPage = () => {\r\n pdfViewerRef.current?.navigation.goToFirstPage();\r\n updatePageDisplay();\r\n };\r\n\r\n const handleLastPage = () => {\r\n pdfViewerRef.current?.navigation.goToLastPage();\r\n updatePageDisplay();\r\n };\r\n\r\n const handlePageInput = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n const page = parseInt(value, 10);\r\n \r\n // Allow typing (update input immediately)\r\n if (/^\\d*$/.test(value)) {\r\n // Valid number format - user is still typing\r\n return;\r\n }\r\n \r\n // Validate and navigate when complete\r\n if (!isNaN(page) && page >= 1 && (totalPages === 0 || page <= totalPages)) {\r\n pdfViewerRef.current?.navigation.goToPage(page);\r\n setCurrentPage(page);\r\n }\r\n };\r\n\r\n const handlePageInputKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === 'Enter') {\r\n const value = (e.target as HTMLInputElement).value;\r\n const page = parseInt(value, 10);\r\n if (!isNaN(page) && page >= 1 && (totalPages === 0 || page <= totalPages)) {\r\n pdfViewerRef.current?.navigation.goToPage(page);\r\n setCurrentPage(page);\r\n }\r\n }\r\n };\r\n\r\n const handleSearch = async () => {\r\n if (searchQuery.trim()) {\r\n setIsSearching(true);\r\n const results = await pdfViewerRef.current?.search.searchText(searchQuery);\r\n setIsSearching(false);\r\n \r\n // Store search results for sidebar\r\n if (results && results.results) {\r\n const formattedResults = results.results.map((result: any, index: number) => {\r\n // Extract text content - try different possible properties\r\n let textContent = '';\r\n let contextContent = '';\r\n \r\n if (typeof result === 'string') {\r\n textContent = result;\r\n contextContent = result;\r\n } else if (result.text) {\r\n textContent = String(result.text);\r\n contextContent = result.context ? String(result.context) : String(result.text);\r\n } else if (result.str) {\r\n textContent = String(result.str);\r\n contextContent = String(result.str);\r\n } else if (result.match) {\r\n textContent = String(result.match);\r\n contextContent = String(result.match);\r\n } else {\r\n textContent = JSON.stringify(result);\r\n contextContent = textContent;\r\n }\r\n \r\n return {\r\n pageNumber: (result.pageIndex ?? result.pageNumber ?? 0) + 1,\r\n text: textContent,\r\n context: contextContent,\r\n index: index\r\n };\r\n });\r\n \r\n setSearchResults(formattedResults);\r\n setTotalSearchResults(formattedResults.length);\r\n setCurrentSearchResultIndex(0);\r\n } else {\r\n setSearchResults([]);\r\n setTotalSearchResults(0);\r\n setCurrentSearchResultIndex(0);\r\n }\r\n }\r\n };\r\n\r\n const handleSearchKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === 'Enter') {\r\n handleSearch();\r\n }\r\n };\r\n\r\n const handleSidebarSearch = async (keyword: string) => {\r\n setSearchQuery(keyword);\r\n if (keyword.trim()) {\r\n setIsSearching(true);\r\n const results = await pdfViewerRef.current?.search.searchText(keyword);\r\n setIsSearching(false);\r\n \r\n // Store search results for sidebar\r\n if (results && results.results) {\r\n const formattedResults = results.results.map((result: any, index: number) => {\r\n // Extract text content from the context object\r\n let textContent = '';\r\n let contextContent = '';\r\n \r\n if (result.context && typeof result.context === 'object') {\r\n // Build the full context string\r\n const before = result.context.before || '';\r\n const match = result.context.match || '';\r\n const after = result.context.after || '';\r\n \r\n textContent = match;\r\n contextContent = `${before}${match}${after}`;\r\n } else if (typeof result === 'string') {\r\n textContent = result;\r\n contextContent = result;\r\n } else {\r\n textContent = String(result.match || result.text || '');\r\n contextContent = textContent;\r\n }\r\n \r\n return {\r\n pageNumber: (result.pageIndex ?? result.pageNumber ?? 0) + 1,\r\n text: textContent,\r\n context: contextContent,\r\n index: index\r\n };\r\n });\r\n \r\n setSearchResults(formattedResults);\r\n setTotalSearchResults(formattedResults.length);\r\n setCurrentSearchResultIndex(0);\r\n \r\n // Navigate to the first result's page\r\n if (formattedResults.length > 0) {\r\n const firstPageNumber = formattedResults[0].pageNumber;\r\n pdfViewerRef.current?.navigation.goToPage(firstPageNumber);\r\n setCurrentPage(firstPageNumber);\r\n }\r\n } else {\r\n setSearchResults([]);\r\n setTotalSearchResults(0);\r\n setCurrentSearchResultIndex(0);\r\n }\r\n } else {\r\n setSearchResults([]);\r\n pdfViewerRef.current?.search.stopSearch();\r\n setTotalSearchResults(0);\r\n setCurrentSearchResultIndex(0);\r\n }\r\n };\r\n\r\n const handleSearchResultClick = (pageNumber: number, resultIndex: number) => {\r\n // Navigate to the page first\r\n pdfViewerRef.current?.navigation.goToPage(pageNumber);\r\n setCurrentSearchResultIndex(resultIndex);\r\n setCurrentPage(pageNumber);\r\n \r\n // Then go to the specific result\r\n pdfViewerRef.current?.search.goToResult(resultIndex);\r\n };\r\n\r\n const toggleSidebar = () => {\r\n setIsSidebarOpen(!isSidebarOpen);\r\n };\r\n\r\n const handleNextSearchResult = () => {\r\n if (currentSearchResultIndex < totalSearchResults - 1) {\r\n const nextIndex = currentSearchResultIndex + 1;\r\n setCurrentSearchResultIndex(nextIndex);\r\n \r\n pdfViewerRef.current?.search.nextResult();\r\n \r\n // Navigate to the page of the next result\r\n if (searchResults[nextIndex]) {\r\n const pageNumber = searchResults[nextIndex].pageNumber;\r\n pdfViewerRef.current?.navigation.goToPage(pageNumber);\r\n setCurrentPage(pageNumber);\r\n }\r\n }\r\n };\r\n\r\n const handlePreviousSearchResult = () => {\r\n if (currentSearchResultIndex > 0) {\r\n const prevIndex = currentSearchResultIndex - 1;\r\n setCurrentSearchResultIndex(prevIndex);\r\n \r\n pdfViewerRef.current?.search.previousResult();\r\n \r\n // Navigate to the page of the previous result\r\n if (searchResults[prevIndex]) {\r\n const pageNumber = searchResults[prevIndex].pageNumber;\r\n pdfViewerRef.current?.navigation.goToPage(pageNumber);\r\n setCurrentPage(pageNumber);\r\n }\r\n }\r\n };\r\n\r\n const handleDownload = () => {\r\n if (onDownloadClick) {\r\n onDownloadClick();\r\n return;\r\n }\r\n \r\n if (!pdfBuffer) return;\r\n \r\n const blob = new Blob([pdfBuffer], { type: 'application/pdf' });\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = resolvedFileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n URL.revokeObjectURL(url);\r\n };\r\n\r\n const handlePrint = () => {\r\n if (onPrintClick) {\r\n onPrintClick();\r\n return;\r\n }\r\n \r\n if (!pdfBuffer) return;\r\n \r\n const blob = new Blob([pdfBuffer], { type: 'application/pdf' });\r\n const blobUrl = URL.createObjectURL(blob);\r\n \r\n // Create hidden iframe for printing\r\n const iframe = document.createElement('iframe');\r\n iframe.style.position = 'fixed';\r\n iframe.style.right = '0';\r\n iframe.style.bottom = '0';\r\n iframe.style.width = '0';\r\n iframe.style.height = '0';\r\n iframe.style.border = '0';\r\n \r\n document.body.appendChild(iframe);\r\n \r\n iframe.onload = () => {\r\n try {\r\n // Give the PDF time to fully load\r\n setTimeout(() => {\r\n const iframeWindow = iframe.contentWindow;\r\n if (!iframeWindow) return;\r\n \r\n iframeWindow.focus();\r\n iframeWindow.print();\r\n \r\n // Listen for when print dialog is closed\r\n // Use a longer timeout and check window focus\r\n const checkPrintComplete = () => {\r\n setTimeout(() => {\r\n try {\r\n document.body.removeChild(iframe);\r\n URL.revokeObjectURL(blobUrl);\r\n } catch (e) {\r\n // Element might already be removed\r\n }\r\n }, 500);\r\n };\r\n \r\n // Try to detect when print dialog closes\r\n if ('onafterprint' in iframeWindow) {\r\n iframeWindow.onafterprint = checkPrintComplete;\r\n } else {\r\n // Fallback: wait longer before cleanup\r\n setTimeout(checkPrintComplete, 3000);\r\n }\r\n }, 500);\r\n } catch (error) {\r\n // Cleanup on error\r\n document.body.removeChild(iframe);\r\n URL.revokeObjectURL(blobUrl);\r\n }\r\n };\r\n\r\n iframe.onerror = () => {\r\n // Cleanup on load error\r\n document.body.removeChild(iframe);\r\n URL.revokeObjectURL(blobUrl);\r\n };\r\n \r\n iframe.src = blobUrl;\r\n };\r\n\r\n // Load PDF from file\r\n useEffect(() => {\r\n if (!file) {\r\n setState('error');\r\n setError('No file provided');\r\n return;\r\n }\r\n\r\n const loadPDF = async () => {\r\n try {\r\n setState('loading');\r\n setError(null);\r\n\r\n let arrayBuffer: ArrayBuffer;\r\n\r\n if (file instanceof File) {\r\n arrayBuffer = await file.arrayBuffer();\r\n } else if (typeof file === 'string') {\r\n // Load from URL\r\n const response = await fetch(file);\r\n if (!response.ok) {\r\n throw new Error(`Failed to load PDF: ${response.statusText}`);\r\n }\r\n arrayBuffer = await response.arrayBuffer();\r\n } else if (file instanceof ArrayBuffer) {\r\n arrayBuffer = file;\r\n } else {\r\n throw new Error('Unsupported file type');\r\n }\r\n\r\n setPdfBuffer(arrayBuffer);\r\n setState('ready');\r\n onLoad?.();\r\n\r\n } catch (err: any) {\r\n const errorMessage = err.message || 'Failed to load PDF';\r\n setState('error');\r\n setError(errorMessage);\r\n onError?.(err);\r\n }\r\n };\r\n\r\n loadPDF();\r\n }, [file, onLoad, onError]);\r\n\r\n // Handle password request for encrypted PDFs\r\n const handlePasswordRequest = useCallback(async (fileName?: string): Promise<string | null> => {\r\n const password = prompt(`This PDF is password protected.\\nEnter password for ${fileName || 'document'}:`);\r\n return password;\r\n }, []);\r\n\r\n if (state === 'loading') {\r\n return (\r\n <div style={{ \r\n display: 'flex', \r\n flexDirection: 'column', \r\n alignItems: 'center', \r\n justifyContent: 'center', \r\n height: '100%',\r\n gap: '16px'\r\n }}>\r\n <div className=\"spinner\" style={{ \r\n width: '48px', \r\n height: '48px', \r\n border: '4px solid #f3f3f3',\r\n borderTop: '4px solid #3498db',\r\n borderRadius: '50%',\r\n animation: 'spin 1s linear infinite'\r\n }} />\r\n <p>Loading PDF...</p>\r\n <style>{`\r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `}</style>\r\n </div>\r\n );\r\n }\r\n\r\n if (state === 'error' || error) {\r\n return (\r\n <div style={{ \r\n display: 'flex', \r\n flexDirection: 'column', \r\n alignItems: 'center', \r\n justifyContent: 'center', \r\n height: '100%',\r\n padding: '24px'\r\n }}>\r\n <div style={{ \r\n maxWidth: '400px',\r\n padding: '16px',\r\n backgroundColor: '#fee',\r\n border: '1px solid #fcc',\r\n borderRadius: '4px'\r\n }}>\r\n <h3 style={{ marginTop: 0 }}>Failed to Load PDF</h3>\r\n <p>{error || 'Unknown error occurred'}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!pdfBuffer || state !== 'ready') {\r\n return (\r\n <div style={{ \r\n display: 'flex', \r\n alignItems: 'center', \r\n justifyContent: 'center', \r\n height: '100%' \r\n }}>\r\n <p>Preparing PDF...</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"pdf-viewer-container\">\r\n <style>{toolbarStyles}</style>\r\n \r\n {/* Header - File Info */}\r\n <div className=\"pdf-viewer-header\">\r\n <FileIcon ext={fileExtension} size={26} />\r\n <div className=\"header-file-name\" title={resolvedFileName}>\r\n {resolvedFileName}\r\n </div>\r\n </div>\r\n \r\n {/* Toolbar */}\r\n <div className=\"pdf-viewer-toolbar\">\r\n\r\n {showPageNavigation && (\r\n <>\r\n <div className=\"toolbar-separator\"></div>\r\n\r\n {/* Page Navigation */}\r\n <div className=\"toolbar-section\">\r\n <button \r\n className=\"toolbar-button\" \r\n onClick={handleFirstPage}\r\n disabled={currentPage <= 1}\r\n title=\"First Page\"\r\n >\r\n <FirstPageIcon fontSize=\"small\" />\r\n </button>\r\n <button \r\n className=\"toolbar-button\" \r\n onClick={handlePreviousPage}\r\n disabled={currentPage <= 1}\r\n title=\"Previous Page\"\r\n >\r\n <ChevronLeftIcon fontSize=\"small\" />\r\n </button>\r\n \r\n <input\r\n type=\"number\"\r\n className=\"page-input\"\r\n value={currentPage}\r\n onChange={handlePageInput}\r\n onKeyPress={handlePageInputKeyPress}\r\n min={1}\r\n max={totalPages || undefined}\r\n />\r\n {showPageCount && <span className=\"page-info\">of {totalPages || '...'}</span>}\r\n \r\n <button \r\n className=\"toolbar-button\" \r\n onClick={handleNextPage}\r\n disabled={currentPage >= totalPages}\r\n title=\"Next Page\"\r\n >\r\n <ChevronRightIcon fontSize=\"small\" />\r\n </button>\r\n <button \r\n className=\"toolbar-button\" \r\n onClick={handleLastPage}\r\n disabled={currentPage >= totalPages}\r\n title=\"Last Page\"\r\n >\r\n <LastPageIcon fontSize=\"small\" />\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n\r\n {showZoomControls && (\r\n <>\r\n <div className=\"toolbar-separator\"></div>\r\n\r\n {/* Zoom Controls */}\r\n <div className=\"toolbar-section\">\r\n <button \r\n className=\"toolbar-button\" \r\n onClick={handleZoomOut}\r\n title=\"Zoom Out\"\r\n >\r\n <ZoomOutIcon fontSize=\"small\" />\r\n </button>\r\n \r\n <span className=\"zoom-display\">{zoom}%</span>\r\n \r\n <button \r\n className=\"toolbar-button\" \r\n onClick={handleZoomIn}\r\n title=\"Zoom In\"\r\n >\r\n <ZoomInIcon fontSize=\"small\" />\r\n </button>\r\n \r\n <button \r\n className=\"toolbar-button\" \r\n onClick={handleFitToWidth}\r\n title=\"Fit to Width\"\r\n >\r\n <AspectRatioIcon fontSize=\"small\" />\r\n </button>\r\n \r\n <button \r\n className=\"toolbar-button\" \r\n onClick={handleFitToPage}\r\n title=\"Fit to Page\"\r\n >\r\n <FitScreenIcon fontSize=\"small\" />\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n\r\n {showSearch && (\r\n <>\r\n <div className=\"toolbar-separator\"></div>\r\n\r\n {/* Search */}\r\n <div className=\"toolbar-section\">\r\n <button \r\n className=\"toolbar-button\" \r\n onClick={toggleSidebar}\r\n title=\"Search in PDF\"\r\n style={{ \r\n backgroundColor: isSidebarOpen ? '#e3f2fd' : 'transparent',\r\n color: isSidebarOpen ? '#1976d2' : 'inherit'\r\n }}\r\n >\r\n <SearchIcon fontSize=\"small\" />\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n\r\n {(showMetadata || showProperties || showDownload || showPrint) && (\r\n <>\r\n <div className=\"toolbar-separator\"></div>\r\n\r\n {/* Metadata & Properties */}\r\n <div className=\"toolbar-section\">\r\n {showDownload && (\r\n <button \r\n className=\"toolbar-button\" \r\n onClick={onDownloadClick}\r\n title=\"Download PDF\"\r\n >\r\n <DownloadIcon fontSize=\"small\" />\r\n </button>\r\n )}\r\n \r\n {showPrint && (\r\n <button \r\n className=\"toolbar-button\" \r\n onClick={onPrintClick}\r\n title=\"Print PDF\"\r\n >\r\n <PrintIcon fontSize=\"small\" />\r\n </button>\r\n )}\r\n \r\n {showMetadata && (\r\n <button \r\n className=\"toolbar-button\" \r\n onClick={onMetadataClick}\r\n title=\"Document Metadata\"\r\n >\r\n <InfoIcon fontSize=\"small\" />\r\n </button>\r\n )}\r\n \r\n {showProperties && (\r\n <button \r\n className=\"toolbar-button\" \r\n onClick={onPropertiesClick}\r\n title=\"Document Properties\"\r\n >\r\n <DescriptionIcon fontSize=\"small\" />\r\n </button>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Main Content Area with Sidebar */}\r\n <div className=\"pdf-viewer-main\">\r\n {/* PDF Viewer */}\r\n <div className=\"pdf-viewer-viewer-area\">\r\n {React.createElement(HeadlessPDFViewer as any, {\r\n ref: pdfViewerRef,\r\n pdfBuffer,\r\n onPasswordRequest: handlePasswordRequest\r\n })}\r\n </div>\r\n\r\n {/* Search Sidebar */}\r\n <SearchSidebar\r\n isOpen={isSidebarOpen}\r\n onClose={() => setIsSidebarOpen(false)}\r\n onSearch={handleSidebarSearch}\r\n onSearchResultClick={handleSearchResultClick}\r\n onNextResult={handleNextSearchResult}\r\n onPreviousResult={handlePreviousSearchResult}\r\n currentResultIndex={currentSearchResultIndex}\r\n totalResults={totalSearchResults}\r\n searchKeyword={searchQuery}\r\n searchResults={searchResults}\r\n isSearching={isSearching}\r\n />\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\nPDFViewerContent.displayName = 'PDFViewerContent';\r\n\r\nexport const PDFViewer = forwardRef<PDFViewerMethods, FileViewerProps>((props, ref) => {\r\n return <PDFViewerContent {...props} sourceDescription=\"doc.pdf\" ref={ref} />;\r\n});\r\n\r\nPDFViewer.displayName = 'PDFViewer';\r\n","import React, { useState, useLayoutEffect, useRef } from 'react';\r\nimport {\r\n Box,\r\n Typography,\r\n TextField,\r\n IconButton,\r\n InputAdornment,\r\n Divider\r\n} from '@mui/material';\r\nimport SearchIcon from '@mui/icons-material/Search';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';\r\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\r\nimport ClearIcon from '@mui/icons-material/Clear';\r\nimport FindInPageIcon from '@mui/icons-material/FindInPage';\r\n\r\ninterface SearchResult {\r\n pageNumber: number;\r\n text: string;\r\n context: string;\r\n index: number;\r\n}\r\n\r\ninterface SearchSidebarProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onSearch: (keyword: string) => void;\r\n onSearchResultClick: (pageNumber: number, resultIndex: number) => void;\r\n onNextResult: () => void;\r\n onPreviousResult: () => void;\r\n currentResultIndex: number;\r\n totalResults: number;\r\n searchKeyword: string;\r\n searchResults?: SearchResult[];\r\n isSearching?: boolean;\r\n}\r\n\r\nexport const SearchSidebar: React.FC<SearchSidebarProps> = ({\r\n isOpen,\r\n onClose,\r\n onSearch,\r\n onSearchResultClick,\r\n onNextResult,\r\n onPreviousResult,\r\n currentResultIndex,\r\n totalResults,\r\n searchKeyword,\r\n searchResults = [],\r\n isSearching = false\r\n}) => {\r\n const [searchTerm, setSearchTerm] = useState(searchKeyword || '');\r\n const [hasSearched, setHasSearched] = useState(false);\r\n const contentRef = useRef<HTMLDivElement>(null);\r\n\r\n // Scrollbar hover handler\r\n useLayoutEffect(() => {\r\n const element = contentRef.current;\r\n if (!element) return;\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n const rect = element.getBoundingClientRect();\r\n const distanceFromRight = rect.right - e.clientX;\r\n const distanceFromBottom = rect.bottom - e.clientY;\r\n\r\n if (distanceFromRight <= 15 || distanceFromBottom <= 15) {\r\n element.classList.add('scrollbar-hover');\r\n } else {\r\n element.classList.remove('scrollbar-hover');\r\n }\r\n };\r\n\r\n const handleMouseLeave = () => element.classList.remove('scrollbar-hover');\r\n\r\n element.addEventListener('mousemove', handleMouseMove);\r\n element.addEventListener('mouseleave', handleMouseLeave);\r\n\r\n return () => {\r\n element.removeEventListener('mousemove', handleMouseMove);\r\n element.removeEventListener('mouseleave', handleMouseLeave);\r\n };\r\n }, []);\r\n\r\n // Inject scrollbar styles\r\n useLayoutEffect(() => {\r\n const style = document.createElement('style');\r\n style.id = 'search-sidebar-scrollbar';\r\n style.textContent = `\r\n @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+Tamil:wght@400;600&family=Noto+Sans+Devanagari:wght@400;600&display=swap');\r\n \r\n .search-sidebar-content::-webkit-scrollbar {\r\n width: 12px;\r\n height: 12px;\r\n }\r\n .search-sidebar-content::-webkit-scrollbar-track {\r\n background-color: transparent;\r\n }\r\n .search-sidebar-content::-webkit-scrollbar-thumb {\r\n background-color: rgba(0, 0, 0, 0.25);\r\n border-radius: 8px;\r\n border: 4px solid transparent;\r\n background-clip: padding-box;\r\n transition: all 0.15s ease;\r\n }\r\n .search-sidebar-content.scrollbar-hover::-webkit-scrollbar-thumb {\r\n background-color: rgba(0, 0, 0, 0.4);\r\n border: 2px solid transparent;\r\n }\r\n .search-sidebar-content::-webkit-scrollbar-thumb:active {\r\n background-color: rgba(25, 118, 210, 0.85);\r\n border: 1px solid transparent;\r\n }\r\n \r\n /* Tamil font support for search results */\r\n .search-result-text {\r\n font-family: 'Noto Sans Tamil', 'Noto Sans Devanagari', Arial, sans-serif !important;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n return () => {\r\n const el = document.getElementById('search-sidebar-scrollbar');\r\n if (el) el.remove();\r\n };\r\n }, []);\r\n\r\n useLayoutEffect(() => {\r\n setSearchTerm(searchKeyword || '');\r\n if (searchKeyword) {\r\n setHasSearched(true);\r\n }\r\n }, [searchKeyword]);\r\n\r\n const handleSearchSubmit = (e?: React.FormEvent) => {\r\n if (e) e.preventDefault();\r\n\r\n if (searchTerm.trim()) {\r\n setHasSearched(true);\r\n onSearch(searchTerm.trim());\r\n }\r\n };\r\n\r\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n setSearchTerm(value);\r\n\r\n if (!value.trim()) {\r\n setHasSearched(false);\r\n onSearch('');\r\n }\r\n };\r\n\r\n const handleClearSearch = () => {\r\n setSearchTerm('');\r\n setHasSearched(false);\r\n onSearch('');\r\n };\r\n\r\n // Group results by page\r\n const resultsByPage = searchResults.reduce((acc, result) => {\r\n if (!acc[result.pageNumber]) {\r\n acc[result.pageNumber] = [];\r\n }\r\n acc[result.pageNumber].push(result);\r\n return acc;\r\n }, {} as Record<number, SearchResult[]>);\r\n\r\n const highlightText = (text: any, keyword: string) => {\r\n if (!keyword) return text;\r\n\r\n const textString = typeof text === 'string' ? text : String(text || '');\r\n if (!textString) return text;\r\n\r\n try {\r\n const escapedKeyword = keyword.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n const regex = new RegExp(`(${escapedKeyword})`, 'gi');\r\n const parts = textString.split(regex);\r\n\r\n return parts.map((part, index) =>\r\n regex.test(part) ? (\r\n <Box\r\n component=\"span\"\r\n key={index}\r\n sx={{\r\n color: 'primary.main',\r\n fontWeight: 600,\r\n fontSize: 'inherit'\r\n }}\r\n >\r\n {part}\r\n </Box>\r\n ) : (\r\n part\r\n )\r\n );\r\n } catch (error) {\r\n // Return plain text if highlighting fails\r\n return textString;\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n width: '320px',\r\n backgroundColor: 'background.paper',\r\n borderLeft: '1px solid',\r\n borderColor: 'divider',\r\n overflow: 'hidden'\r\n }}\r\n >\r\n {/* Header */}\r\n <Box sx={{ px: 3, py: 2.5, backgroundColor: 'background.default' }}>\r\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 2 }}>\r\n <Typography variant=\"h6\" sx={{ fontSize: '1.125rem', fontWeight: 600, color: 'text.primary' }}>\r\n Search\r\n </Typography>\r\n <IconButton\r\n size=\"small\"\r\n onClick={onClose}\r\n sx={{\r\n color: 'text.secondary',\r\n padding: '6px'\r\n }}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Search Input */}\r\n <form onSubmit={handleSearchSubmit}>\r\n <TextField\r\n fullWidth\r\n size=\"medium\"\r\n placeholder=\"Search in document...\"\r\n value={searchTerm}\r\n onChange={handleSearchChange}\r\n autoComplete=\"off\"\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <SearchIcon sx={{ color: 'text.disabled', fontSize: 20 }} />\r\n </InputAdornment>\r\n ),\r\n endAdornment: searchTerm && (\r\n <InputAdornment position=\"end\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleClearSearch}\r\n sx={{\r\n color: 'text.secondary',\r\n padding: '4px',\r\n '&:hover': {\r\n backgroundColor: 'action.hover'\r\n }\r\n }}\r\n >\r\n <ClearIcon sx={{ fontSize: 18 }} />\r\n </IconButton>\r\n </InputAdornment>\r\n )\r\n }}\r\n sx={{\r\n '& .MuiOutlinedInput-root': {\r\n fontSize: '0.9375rem',\r\n backgroundColor: 'background.paper',\r\n borderRadius: '8px',\r\n '& fieldset': {\r\n borderColor: 'divider'\r\n },\r\n '&.Mui-focused fieldset': {\r\n borderColor: 'primary.main',\r\n borderWidth: '2px'\r\n }\r\n },\r\n '& .MuiInputBase-input': {\r\n padding: '10px 14px'\r\n }\r\n }}\r\n />\r\n </form>\r\n\r\n {/* Results Summary and Navigation */}\r\n {totalResults > 0 && (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n mt: 2,\r\n pt: 2,\r\n borderTop: '1px solid',\r\n borderColor: 'divider'\r\n }}\r\n >\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', fontSize: '0.875rem', fontWeight: 500 }}>\r\n {currentResultIndex + 1} of {totalResults} results\r\n </Typography>\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\r\n <IconButton\r\n size=\"small\"\r\n onClick={onPreviousResult}\r\n disabled={currentResultIndex <= 0}\r\n sx={{\r\n color: currentResultIndex <= 0 ? 'text.disabled' : 'primary.main',\r\n padding: '6px',\r\n borderRadius: '6px',\r\n border: '1px solid',\r\n borderColor: currentResultIndex <= 0 ? 'divider' : 'primary.main'\r\n }}\r\n >\r\n <KeyboardArrowUpIcon sx={{ fontSize: 20 }} />\r\n </IconButton>\r\n <IconButton\r\n size=\"small\"\r\n onClick={onNextResult}\r\n disabled={currentResultIndex >= totalResults - 1}\r\n sx={{\r\n color: currentResultIndex >= totalResults - 1 ? 'text.disabled' : 'primary.main',\r\n padding: '6px',\r\n borderRadius: '6px',\r\n border: '1px solid',\r\n borderColor: currentResultIndex >= totalResults - 1 ? 'divider' : 'primary.main'\r\n }}\r\n >\r\n <KeyboardArrowDownIcon sx={{ fontSize: 20 }} />\r\n </IconButton>\r\n </Box>\r\n </Box>\r\n )}\r\n </Box>\r\n\r\n <Divider />\r\n\r\n {/* Search Results */}\r\n <Box ref={contentRef} className=\"search-sidebar-content\" sx={{\r\n flex: 1,\r\n overflow: 'auto',\r\n backgroundColor: 'background.default'\r\n }}>\r\n {!searchTerm && !hasSearched && (\r\n <Box sx={{ p: 4, textAlign: 'center', mt: 6 }}>\r\n <Box\r\n sx={{\r\n width: 80,\r\n height: 80,\r\n borderRadius: '50%',\r\n backgroundColor: 'action.hover',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto',\r\n mb: 3\r\n }}\r\n >\r\n <SearchIcon sx={{ fontSize: 40, color: 'text.disabled' }} />\r\n </Box>\r\n <Typography variant=\"body1\" sx={{ color: 'text.primary', fontWeight: 500, mb: 1 }}>\r\n Search in Document\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', lineHeight: 1.6 }}>\r\n Enter keywords to find text within the PDF document\r\n </Typography>\r\n </Box>\r\n )}\r\n\r\n {searchTerm && !hasSearched && (\r\n <Box sx={{ p: 4, textAlign: 'center', mt: 6 }}>\r\n <Box\r\n sx={{\r\n width: 80,\r\n height: 80,\r\n borderRadius: '50%',\r\n backgroundColor: '#e3f2fd',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto',\r\n mb: 3\r\n }}\r\n >\r\n <FindInPageIcon sx={{ fontSize: 40, color: 'primary.main' }} />\r\n </Box>\r\n <Typography variant=\"body1\" sx={{ color: 'text.primary', fontWeight: 500, mb: 1 }}>\r\n Ready to Search\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', mb: 2, lineHeight: 1.6 }}>\r\n Press Enter to find\r\n </Typography>\r\n <Typography\r\n variant=\"body2\"\r\n sx={{\r\n color: 'primary.main',\r\n fontWeight: 600,\r\n backgroundColor: '#e3f2fd',\r\n padding: '6px 16px',\r\n borderRadius: '16px',\r\n display: 'inline-block'\r\n }}\r\n >\r\n \"{searchTerm}\"\r\n </Typography>\r\n </Box>\r\n )}\r\n\r\n {hasSearched && totalResults === 0 && !isSearching && (\r\n <Box sx={{ p: 4, textAlign: 'center', mt: 6 }}>\r\n <Box\r\n sx={{\r\n width: 80,\r\n height: 80,\r\n borderRadius: '50%',\r\n backgroundColor: '#fff3e0',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto',\r\n mb: 3\r\n }}\r\n >\r\n <SearchIcon sx={{ fontSize: 40, color: '#ff9800' }} />\r\n </Box>\r\n <Typography variant=\"body1\" sx={{ color: 'text.primary', fontWeight: 500, mb: 1 }}>\r\n No Results Found\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', lineHeight: 1.6 }}>\r\n No matches found for <strong>\"{searchTerm}\"</strong>\r\n </Typography>\r\n </Box>\r\n )}\r\n\r\n {totalResults > 0 && (\r\n <Box sx={{ p: 2 }}>\r\n {(Object.entries(resultsByPage) as [string, SearchResult[]][])\r\n .sort(([a, _], [b, __]) => parseInt(a) - parseInt(b))\r\n .map(([pageNum, pageResults]) => {\r\n const pageNumber = parseInt(pageNum);\r\n\r\n return (\r\n <Box key={pageNumber} sx={{ mb: 3 }}>\r\n {/* Page Header */}\r\n <Typography\r\n variant=\"subtitle2\"\r\n sx={{\r\n color: 'text.secondary',\r\n mb: 1.5,\r\n px: 1,\r\n fontSize: '0.8125rem',\r\n fontWeight: 600,\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.5px'\r\n }}\r\n >\r\n Page {pageNumber}\r\n </Typography>\r\n\r\n {/* Results for this page */}\r\n {pageResults.map((result: SearchResult, index: number) => (\r\n <Box\r\n key={index}\r\n onClick={() => onSearchResultClick(result.pageNumber, result.index)}\r\n sx={{\r\n p: 2,\r\n mx: 1,\r\n mb: 1.5,\r\n borderRadius: '8px',\r\n border: '1px solid',\r\n borderColor: result.index === currentResultIndex ? 'primary.main' : 'divider',\r\n backgroundColor: result.index === currentResultIndex ? '#e3f2fd' : 'background.paper',\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n boxShadow: result.index === currentResultIndex ? '0 2px 8px rgba(25, 118, 210, 0.15)' : '0 1px 3px rgba(0, 0, 0, 0.05)',\r\n '&:hover': {\r\n borderColor: 'primary.main',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\r\n transform: 'translateY(-1px)'\r\n }\r\n }}\r\n >\r\n <Typography\r\n variant=\"body2\"\r\n className=\"search-result-text\"\r\n sx={{\r\n fontSize: '0.875rem',\r\n lineHeight: 1.6,\r\n color: result.index === currentResultIndex ? 'text.primary' : 'text.secondary'\r\n }}\r\n >\r\n {highlightText(result.context, searchTerm)}\r\n </Typography>\r\n </Box>\r\n ))}\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n"],"mappings":"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","names":["React","useRef","useState","SearchIcon","jsx","jsxs","useState","useRef","error","zoom","fileName","SearchIcon","React"]}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
var _chunkRE4XRGSVjs = require('./chunk-RE4XRGSV.js');
|
|
6
|
+
|
|
7
|
+
// src/components/viewers/TextViewer.tsx
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
var _react = require('react');
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
var _material = require('@mui/material');
|
|
26
|
+
var _Download = require('@mui/icons-material/Download'); var _Download2 = _interopRequireDefault(_Download);
|
|
27
|
+
var _reactwindow = require('react-window');
|
|
28
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
29
|
+
var LINE_HEIGHT = 24;
|
|
30
|
+
var TextViewer = ({
|
|
31
|
+
file,
|
|
32
|
+
url,
|
|
33
|
+
fileName,
|
|
34
|
+
className = "",
|
|
35
|
+
style = {},
|
|
36
|
+
width = "100%",
|
|
37
|
+
height = "100%",
|
|
38
|
+
onLoad,
|
|
39
|
+
onError,
|
|
40
|
+
onDownloadClick,
|
|
41
|
+
// Filter out props that shouldn't be passed to DOM
|
|
42
|
+
mimeType: _mimeType,
|
|
43
|
+
fileSize: _fileSize,
|
|
44
|
+
showPageCount: _showPageCount,
|
|
45
|
+
showPageNavigation: _showPageNavigation,
|
|
46
|
+
showZoomControls: _showZoomControls,
|
|
47
|
+
showDownload: _showDownload,
|
|
48
|
+
showPrint: _showPrint,
|
|
49
|
+
showSearch: _showSearch,
|
|
50
|
+
showMetadata: _showMetadata,
|
|
51
|
+
showProperties: _showProperties,
|
|
52
|
+
onMetadataClick: _onMetadataClick,
|
|
53
|
+
onPropertiesClick: _onPropertiesClick,
|
|
54
|
+
onPrintClick: _onPrintClick,
|
|
55
|
+
customRegistry: _customRegistry,
|
|
56
|
+
...props
|
|
57
|
+
}) => {
|
|
58
|
+
const [content, setContent] = _react.useState.call(void 0, "");
|
|
59
|
+
const [lines, setLines] = _react.useState.call(void 0, []);
|
|
60
|
+
const [isLoading, setIsLoading] = _react.useState.call(void 0, false);
|
|
61
|
+
const [error, setError] = _react.useState.call(void 0, null);
|
|
62
|
+
const resolvedFileName = _react.useMemo.call(void 0,
|
|
63
|
+
() => fileName || _optionalChain([file, 'optionalAccess', _ => _.name]) || (url ? url.split("/").pop() : "text-document"),
|
|
64
|
+
[fileName, file, url]
|
|
65
|
+
);
|
|
66
|
+
const fileExtension = _react.useMemo.call(void 0,
|
|
67
|
+
() => _chunkRE4XRGSVjs.getFileExtension.call(void 0, resolvedFileName || ""),
|
|
68
|
+
[resolvedFileName]
|
|
69
|
+
);
|
|
70
|
+
const loadText = _react.useCallback.call(void 0, async () => {
|
|
71
|
+
if (!file && !url) {
|
|
72
|
+
setContent("");
|
|
73
|
+
setLines([]);
|
|
74
|
+
setError(null);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
setIsLoading(true);
|
|
78
|
+
setError(null);
|
|
79
|
+
try {
|
|
80
|
+
let textContent;
|
|
81
|
+
if (file) {
|
|
82
|
+
textContent = await file.text();
|
|
83
|
+
} else {
|
|
84
|
+
const response = await fetch(url);
|
|
85
|
+
if (!response.ok) {
|
|
86
|
+
throw new Error(`Failed to fetch text (${response.status})`);
|
|
87
|
+
}
|
|
88
|
+
textContent = await response.text();
|
|
89
|
+
}
|
|
90
|
+
setContent(textContent);
|
|
91
|
+
setLines(textContent.split(/\r?\n/));
|
|
92
|
+
_optionalChain([onLoad, 'optionalCall', _2 => _2()]);
|
|
93
|
+
} catch (err) {
|
|
94
|
+
const message = err instanceof Error ? err.message : "Unable to load text file";
|
|
95
|
+
setError(message);
|
|
96
|
+
setContent("");
|
|
97
|
+
setLines([]);
|
|
98
|
+
_optionalChain([onError, 'optionalCall', _3 => _3(new Error(message))]);
|
|
99
|
+
} finally {
|
|
100
|
+
setIsLoading(false);
|
|
101
|
+
}
|
|
102
|
+
}, [file, url, onLoad, onError]);
|
|
103
|
+
_react.useEffect.call(void 0, () => {
|
|
104
|
+
void loadText();
|
|
105
|
+
}, [loadText]);
|
|
106
|
+
const handleDownload = _react.useCallback.call(void 0, () => {
|
|
107
|
+
if (!content) return;
|
|
108
|
+
const blob = new Blob([content], { type: "text/plain" });
|
|
109
|
+
const url2 = URL.createObjectURL(blob);
|
|
110
|
+
const link = document.createElement("a");
|
|
111
|
+
link.href = url2;
|
|
112
|
+
link.download = resolvedFileName || "document.txt";
|
|
113
|
+
document.body.appendChild(link);
|
|
114
|
+
link.click();
|
|
115
|
+
document.body.removeChild(link);
|
|
116
|
+
URL.revokeObjectURL(url2);
|
|
117
|
+
}, [content, resolvedFileName]);
|
|
118
|
+
const Row = _react.useCallback.call(void 0, ({ index, style: rowStyle }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
119
|
+
_material.Box,
|
|
120
|
+
{
|
|
121
|
+
style: rowStyle,
|
|
122
|
+
sx: {
|
|
123
|
+
px: 2,
|
|
124
|
+
display: "flex",
|
|
125
|
+
alignItems: "center",
|
|
126
|
+
whiteSpace: "pre",
|
|
127
|
+
fontFamily: "monospace",
|
|
128
|
+
fontSize: "0.85rem"
|
|
129
|
+
},
|
|
130
|
+
children: lines[index] || "\xA0"
|
|
131
|
+
}
|
|
132
|
+
), [lines]);
|
|
133
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
134
|
+
_material.Box,
|
|
135
|
+
{
|
|
136
|
+
className: `text-viewer ${className}`,
|
|
137
|
+
sx: { width, height, ...style },
|
|
138
|
+
...props,
|
|
139
|
+
children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.Card, { sx: { height: "100%", display: "flex", flexDirection: "column" }, elevation: 1, children: [
|
|
140
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
141
|
+
_material.CardHeader,
|
|
142
|
+
{
|
|
143
|
+
avatar: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkRE4XRGSVjs.FileIcon_default, { ext: fileExtension, size: 32 }),
|
|
144
|
+
title: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { variant: "subtitle1", fontWeight: 500, children: resolvedFileName }),
|
|
145
|
+
action: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Tooltip, { title: "Download", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
146
|
+
_material.IconButton,
|
|
147
|
+
{
|
|
148
|
+
size: "small",
|
|
149
|
+
onClick: onDownloadClick,
|
|
150
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Download2.default, {})
|
|
151
|
+
}
|
|
152
|
+
) }),
|
|
153
|
+
sx: { pb: 1 }
|
|
154
|
+
}
|
|
155
|
+
),
|
|
156
|
+
isLoading && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.LinearProgress, { sx: { mx: 3, mb: 1 } }),
|
|
157
|
+
error && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { color: "error", variant: "body2", sx: { px: 3, pb: 1 }, children: error }),
|
|
158
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Divider, {}),
|
|
159
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.CardContent, { sx: { flexGrow: 1, minHeight: 0, display: "flex", flexDirection: "column", p: 0 }, children: content ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Stack, { sx: { flex: 1, position: "relative" }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
160
|
+
_reactwindow.FixedSizeList,
|
|
161
|
+
{
|
|
162
|
+
height: typeof height === "number" ? height - 140 : 520,
|
|
163
|
+
itemCount: lines.length,
|
|
164
|
+
itemSize: LINE_HEIGHT,
|
|
165
|
+
width: "100%",
|
|
166
|
+
children: Row
|
|
167
|
+
}
|
|
168
|
+
) }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Box, { sx: { flex: 1, display: "flex", alignItems: "center", justifyContent: "center", p: 4 }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { variant: "body2", color: "text.secondary", children: "No text content available." }) }) })
|
|
169
|
+
] })
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
exports.TextViewer = TextViewer;
|
|
177
|
+
//# sourceMappingURL=chunk-7JTIG6OU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["d:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\chunk-7JTIG6OU.js"],"names":[],"mappings":"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","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\chunk-7JTIG6OU.js","sourcesContent":[null]}
|