@cannymindstech/file-viewers 0.27.1
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-2BLHLWNN.js +299 -0
- package/dist/chunk-2BLHLWNN.js.map +1 -0
- package/dist/chunk-6BRYDA3B.js +329 -0
- package/dist/chunk-6BRYDA3B.js.map +1 -0
- package/dist/chunk-6MV4VQQN.mjs +2269 -0
- package/dist/chunk-6MV4VQQN.mjs.map +1 -0
- package/dist/chunk-7JPF5AYR.mjs +488 -0
- package/dist/chunk-7JPF5AYR.mjs.map +1 -0
- package/dist/chunk-7LPCKPN2.js +2269 -0
- package/dist/chunk-7LPCKPN2.js.map +1 -0
- package/dist/chunk-7PMZ4GN5.mjs +290 -0
- package/dist/chunk-7PMZ4GN5.mjs.map +1 -0
- package/dist/chunk-B5NNB4KD.mjs +268 -0
- package/dist/chunk-B5NNB4KD.mjs.map +1 -0
- package/dist/chunk-CIWCHSAA.js +309 -0
- package/dist/chunk-CIWCHSAA.js.map +1 -0
- package/dist/chunk-D7SDEVDM.js +268 -0
- package/dist/chunk-D7SDEVDM.js.map +1 -0
- package/dist/chunk-ECZ6IBOS.js +424 -0
- package/dist/chunk-ECZ6IBOS.js.map +1 -0
- package/dist/chunk-EKNP342T.mjs +299 -0
- package/dist/chunk-EKNP342T.mjs.map +1 -0
- package/dist/chunk-EM63H4SA.js +290 -0
- package/dist/chunk-EM63H4SA.js.map +1 -0
- package/dist/chunk-IJMNPAXX.mjs +309 -0
- package/dist/chunk-IJMNPAXX.mjs.map +1 -0
- package/dist/chunk-KJNOBIUZ.mjs +36 -0
- package/dist/chunk-KJNOBIUZ.mjs.map +1 -0
- package/dist/chunk-KQCU7XW2.mjs +424 -0
- package/dist/chunk-KQCU7XW2.mjs.map +1 -0
- package/dist/chunk-MJYCPSD4.js +742 -0
- package/dist/chunk-MJYCPSD4.js.map +1 -0
- package/dist/chunk-OPJOCUSL.js +36 -0
- package/dist/chunk-OPJOCUSL.js.map +1 -0
- package/dist/chunk-QGL3ZOPD.mjs +742 -0
- package/dist/chunk-QGL3ZOPD.mjs.map +1 -0
- package/dist/chunk-QV63FULE.js +488 -0
- package/dist/chunk-QV63FULE.js.map +1 -0
- package/dist/chunk-XJQ5J2UF.mjs +329 -0
- package/dist/chunk-XJQ5J2UF.mjs.map +1 -0
- package/dist/components/viewers/AudioViewer.d.mts +6 -0
- package/dist/components/viewers/AudioViewer.d.ts +6 -0
- package/dist/components/viewers/AudioViewer.js +10 -0
- package/dist/components/viewers/AudioViewer.js.map +1 -0
- package/dist/components/viewers/AudioViewer.mjs +10 -0
- package/dist/components/viewers/AudioViewer.mjs.map +1 -0
- package/dist/components/viewers/DefaultViewer.d.mts +6 -0
- package/dist/components/viewers/DefaultViewer.d.ts +6 -0
- package/dist/components/viewers/DefaultViewer.js +10 -0
- package/dist/components/viewers/DefaultViewer.js.map +1 -0
- package/dist/components/viewers/DefaultViewer.mjs +10 -0
- package/dist/components/viewers/DefaultViewer.mjs.map +1 -0
- package/dist/components/viewers/ImageViewer.d.mts +6 -0
- package/dist/components/viewers/ImageViewer.d.ts +6 -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.d.mts +51 -0
- package/dist/components/viewers/PDFViewer.d.ts +51 -0
- package/dist/components/viewers/PDFViewer.js +11 -0
- package/dist/components/viewers/PDFViewer.js.map +1 -0
- package/dist/components/viewers/PDFViewer.mjs +11 -0
- package/dist/components/viewers/PDFViewer.mjs.map +1 -0
- package/dist/components/viewers/TIFFViewer.d.mts +6 -0
- package/dist/components/viewers/TIFFViewer.d.ts +6 -0
- package/dist/components/viewers/TIFFViewer.js +10 -0
- package/dist/components/viewers/TIFFViewer.js.map +1 -0
- package/dist/components/viewers/TIFFViewer.mjs +10 -0
- package/dist/components/viewers/TIFFViewer.mjs.map +1 -0
- package/dist/components/viewers/TextViewer.d.mts +6 -0
- package/dist/components/viewers/TextViewer.d.ts +6 -0
- package/dist/components/viewers/TextViewer.js +10 -0
- package/dist/components/viewers/TextViewer.js.map +1 -0
- package/dist/components/viewers/TextViewer.mjs +10 -0
- package/dist/components/viewers/TextViewer.mjs.map +1 -0
- package/dist/components/viewers/VideoViewer.d.mts +6 -0
- package/dist/components/viewers/VideoViewer.d.ts +6 -0
- package/dist/components/viewers/VideoViewer.js +10 -0
- package/dist/components/viewers/VideoViewer.js.map +1 -0
- package/dist/components/viewers/VideoViewer.mjs +10 -0
- package/dist/components/viewers/VideoViewer.mjs.map +1 -0
- package/dist/index.d.mts +75 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.js +305 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +305 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types-AT684fjV.d.mts +96 -0
- package/dist/types-AT684fjV.d.ts +96 -0
- package/package.json +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/viewers/TIFFViewer.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Box,\n Button,\n ButtonGroup,\n Card,\n CardContent,\n CardHeader,\n Divider,\n LinearProgress,\n Stack,\n Typography,\n IconButton,\n Tooltip,\n} from \"@mui/material\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport PrintIcon from \"@mui/icons-material/Print\";\nimport FullscreenIcon from \"@mui/icons-material/Fullscreen\";\nimport FirstPageIcon from \"@mui/icons-material/FirstPage\";\nimport LastPageIcon from \"@mui/icons-material/LastPage\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport ZoomInIcon from \"@mui/icons-material/ZoomIn\";\nimport ZoomOutIcon from \"@mui/icons-material/ZoomOut\";\nimport FitScreenIcon from \"@mui/icons-material/FitScreen\";\nimport AspectRatioIcon from \"@mui/icons-material/AspectRatio\";\nimport InfoIcon from \"@mui/icons-material/Info\";\nimport DescriptionIcon from \"@mui/icons-material/Description\";\nimport HistoryIcon from \"@mui/icons-material/History\";\nimport { LocalOffer } from \"@mui/icons-material\";\nimport { FileViewerProps } from \"../../types\";\nimport { getFileExtension } from \"../../utils/fileUtils\";\nimport { mergeToolbarConfig } from \"../../utils/toolbarUtils\";\nimport FileIcon from \"../FileIcon\";\n\nconst resolveDocumentName = (file?: File, fileName?: string, url?: string) => {\n if (file?.name) {\n return file.name;\n }\n if (fileName) {\n return fileName;\n }\n if (url) {\n const parts = url.split(\"?\")[0]?.split(\"#\")[0]?.split(\"/\") ?? [];\n return parts[parts.length - 1] || \"document.tiff\";\n }\n return \"document.tiff\";\n};\n\ninterface TIFFViewerContentProps extends FileViewerProps {\n sourceDescription: string;\n}\n\nconst TIFFViewerContent: React.FC<TIFFViewerContentProps> = ({\n sourceDescription,\n file,\n url,\n fileName,\n totalPages = 1,\n className = \"\",\n style = {},\n width = \"100%\",\n height = \"100%\",\n onLoad,\n onError,\n onDownloadClick,\n onPrintClick,\n onTagsClick,\n onMetadataClick,\n onPropertiesClick,\n onHistoryClick,\n pageLoader,\n showDownload = true,\n showPrint = true,\n showMetadata = false,\n showTags = true,\n showProperties = false,\n showHistory = true,\n // Extract props that shouldn't be passed to DOM elements\n mimeType,\n fileSize,\n showPageCount,\n showPageNavigation,\n showZoomControls,\n showSearch,\n customRegistry,\n initialSearchText,\n initialSearchPages,\n autoOpenSearch,\n autoExecuteSearch,\n onSearchComplete,\n toolbarActions,\n ...props\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [fitMode, setFitMode] = useState<\"fit-width\" | \"fit-page\" | \"zoom\">(\n \"fit-page\"\n );\n const [zoom, setZoom] = useState(100);\n const [viewportWidth, setViewportWidth] = useState<number>(0);\n const [viewportHeight, setViewportHeight] = useState<number>(0);\n const [isFullScreen, setIsFullScreen] = useState(false);\n const [imageUrl, setImageUrl] = useState<string | null>(null);\n const [pageImages, setPageImages] = useState<Map<number, string>>(new Map());\n const [internalLoading, setInternalLoading] = useState(false);\n const [imageSize, setImageSize] = useState<{\n width: number;\n height: number;\n } | null>(null);\n\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement | null>(null);\n\n // Store pageLoader in ref to prevent re-renders\n const pageLoaderRef = useRef(pageLoader);\n useEffect(() => {\n pageLoaderRef.current = pageLoader;\n }, [pageLoader]);\n\n // Update page image from ArrayBuffer data\n const updatePageImage = useCallback(\n (pageData: ArrayBuffer, pageNumber: number) => {\n const blob = new Blob([pageData]);\n const imageUrl = URL.createObjectURL(blob);\n\n setPageImages((prev) => {\n // Only clean up old URL if we're replacing with a different one\n const oldUrl = prev.get(pageNumber);\n if (oldUrl && oldUrl !== imageUrl) {\n URL.revokeObjectURL(oldUrl);\n }\n return new Map(prev).set(pageNumber, imageUrl);\n });\n setCurrentPage(pageNumber);\n setImageUrl(imageUrl);\n },\n []\n );\n\n // Load initial page when pageLoader is available\n useEffect(() => {\n const loadInitialPage = async () => {\n if (pageLoaderRef.current && !pageImages.has(1) && currentPage === 1) {\n setInternalLoading(true);\n setError(null);\n\n try {\n const pageData = await pageLoaderRef.current(1);\n if (pageData) {\n updatePageImage(pageData, 1);\n } else {\n setError(\"Failed to load page 1\");\n }\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Unable to load page 1\";\n setError(message);\n onError?.(new Error(message));\n } finally {\n setInternalLoading(false);\n }\n }\n };\n\n loadInitialPage();\n }, [pageImages, currentPage, updatePageImage, onError]);\n\n // Handle internal page navigation\n const handlePageChange = useCallback(\n async (newPageNumber: number) => {\n if (!pageLoaderRef.current) {\n console.warn(\"pageLoader not provided - page navigation disabled\");\n return;\n }\n\n // Check if page is already cached\n const cachedUrl = pageImages.get(newPageNumber);\n if (cachedUrl) {\n setCurrentPage(newPageNumber);\n setImageUrl(cachedUrl);\n return;\n }\n\n setInternalLoading(true);\n setError(null);\n\n try {\n const pageData = await pageLoaderRef.current(newPageNumber);\n if (pageData) {\n updatePageImage(pageData, newPageNumber);\n } else {\n setError(`Failed to load page ${newPageNumber}`);\n }\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : `Unable to load page ${newPageNumber}`;\n setError(message);\n onError?.(new Error(message));\n } finally {\n setInternalLoading(false);\n }\n },\n [pageImages, onError, updatePageImage]\n );\n\n const resolvedFileName = useMemo(\n () => fileName || sourceDescription,\n [fileName, sourceDescription]\n );\n\n const fileExtension = useMemo(\n () => getFileExtension(resolvedFileName || \"\"),\n [resolvedFileName]\n );\n\n const loadImage = useCallback(\n async (resetPage = false) => {\n if (!file && !url) {\n setImageUrl(null);\n if (resetPage) setCurrentPage(1);\n setError(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n let imageDataUrl: string;\n if (file) {\n imageDataUrl = URL.createObjectURL(file);\n } else if (url) {\n imageDataUrl = url;\n } else {\n throw new Error(\"No file or URL provided\");\n }\n\n setImageUrl(imageDataUrl);\n if (resetPage) {\n setCurrentPage(1);\n setFitMode(\"fit-page\");\n setZoom(100);\n }\n onLoad?.();\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Unable to load image file\";\n setError(message);\n setImageUrl(null);\n if (resetPage) {\n setCurrentPage(1);\n setFitMode(\"fit-width\");\n setZoom(100);\n }\n onError?.(new Error(message));\n } finally {\n setIsLoading(false);\n }\n },\n [file, url, onLoad, onError]\n );\n\n const [previousFileSource, setPreviousFileSource] = useState<{\n file?: File;\n url?: string;\n }>({});\n\n useEffect(() => {\n const currentFileSource = { file, url };\n const isNewFile =\n previousFileSource.file !== file || previousFileSource.url !== url;\n\n if (isNewFile) {\n setPreviousFileSource(currentFileSource);\n void loadImage(true); // Reset page on new file\n } else {\n void loadImage(false); // Don't reset page for same file\n }\n }, [file, url, loadImage, previousFileSource.file, previousFileSource.url]);\n\n useEffect(() => {\n return () => {\n // Clean up all cached page URLs only on unmount\n pageImages.forEach((url) => {\n URL.revokeObjectURL(url);\n });\n // Clean up current image URL if it's from a file (not from pageLoader)\n if (imageUrl && file && !pageImages.has(currentPage)) {\n URL.revokeObjectURL(imageUrl);\n }\n };\n }, []); // Empty dependency array - only cleanup on unmount\n\n const hasImage = !!imageUrl;\n const hasMultiplePages = totalPages > 1;\n\n // Constants for zoom calculation\n const MARGIN = 40;\n const MIN_ZOOM = 25;\n const MAX_ZOOM = 400;\n const ZOOM_LEVELS = [25, 50, 75, 100, 125, 150, 200, 300, 400];\n\n // Helper function to calculate zoom based on fit mode\n const calculateFitZoom = useCallback(\n (mode: \"fit-width\" | \"fit-page\"): number | null => {\n if (!imageSize || viewportWidth <= 0) return null;\n\n const availableWidth = viewportWidth - MARGIN;\n\n if (mode === \"fit-width\") {\n const calculatedZoom = Math.round(\n (availableWidth / imageSize.width) * 100\n );\n return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, calculatedZoom));\n }\n\n if (mode === \"fit-page\" && viewportHeight > 0) {\n const availableHeight = viewportHeight - MARGIN;\n const scaleW = availableWidth / imageSize.width;\n const scaleH = availableHeight / imageSize.height;\n const calculatedZoom = Math.round(Math.min(scaleW, scaleH) * 100);\n return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, calculatedZoom));\n }\n\n return null;\n },\n [imageSize, viewportWidth, viewportHeight]\n );\n\n // Recalculate zoom when changing pages in fit modes\n useEffect(() => {\n if (!hasImage || !imageSize) return;\n\n const newZoom = calculateFitZoom(fitMode as \"fit-width\" | \"fit-page\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [currentPage, hasImage, imageSize, fitMode, calculateFitZoom]);\n\n useEffect(() => {\n if (\n typeof window === \"undefined\" ||\n typeof ResizeObserver === \"undefined\"\n ) {\n return undefined;\n }\n\n if (!viewportRef.current) {\n return undefined;\n }\n\n const updateSize = () => {\n const bounds = viewportRef.current?.getBoundingClientRect();\n if (bounds) {\n setViewportWidth(bounds.width);\n setViewportHeight(bounds.height);\n }\n };\n\n updateSize();\n const observer = new ResizeObserver(updateSize);\n observer.observe(viewportRef.current);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const handleZoomIn = useCallback(() => {\n setFitMode(\"zoom\");\n setZoom((value) => {\n const nextLevel = ZOOM_LEVELS.find((level) => level > value);\n return nextLevel || MAX_ZOOM;\n });\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setFitMode(\"zoom\");\n setZoom((value) => {\n const prevLevel = [...ZOOM_LEVELS]\n .reverse()\n .find((level) => level < value);\n return prevLevel || MIN_ZOOM;\n });\n }, []);\n\n const handleFitWidth = useCallback(() => {\n setFitMode(\"fit-width\");\n const newZoom = calculateFitZoom(\"fit-width\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [calculateFitZoom]);\n\n const handleFitPage = useCallback(() => {\n setFitMode(\"fit-page\");\n const newZoom = calculateFitZoom(\"fit-page\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [calculateFitZoom]);\n\n const handleFirstPage = useCallback(() => {\n handlePageChange(1);\n }, [handlePageChange]);\n\n const handleLastPage = useCallback(() => {\n handlePageChange(totalPages);\n }, [handlePageChange, totalPages]);\n\n const handlePreviousPage = useCallback(() => {\n const newPage = Math.max(currentPage - 1, 1);\n if (newPage !== currentPage) {\n handlePageChange(newPage);\n }\n }, [currentPage, handlePageChange]);\n\n const handleNextPage = useCallback(() => {\n const newPage = Math.min(currentPage + 1, totalPages);\n if (newPage !== currentPage) {\n handlePageChange(newPage);\n }\n }, [currentPage, totalPages, handlePageChange]);\n\n const handleToggleFullScreen = useCallback(() => {\n if (!isFullScreen && containerRef.current?.requestFullscreen) {\n containerRef.current.requestFullscreen();\n setIsFullScreen(true);\n } else if (isFullScreen && document.exitFullscreen) {\n document.exitFullscreen();\n setIsFullScreen(false);\n }\n }, [isFullScreen]);\n\n const toolbar = mergeToolbarConfig({\n showDownload,\n showPrint,\n showMetadata,\n showTags,\n showProperties,\n showHistory,\n onDownloadClick,\n onPrintClick,\n onTagsClick,\n onMetadataClick,\n onPropertiesClick,\n onHistoryClick,\n toolbarActions,\n });\n\n const displayScale = zoom;\n\n const handleImageLoad = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement>) => {\n const img = e.currentTarget;\n setImageSize({ width: img.naturalWidth, height: img.naturalHeight });\n if (!hasImage) {\n onLoad?.();\n }\n },\n [hasImage, onLoad]\n );\n\n const renderImage = () => {\n if (!imageUrl) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No image available.\n </Typography>\n );\n }\n\n // Calculate scaled dimensions based on zoom\n let imgStyle: React.CSSProperties = {\n display: \"block\",\n borderRadius: \"4px\",\n };\n\n if (imageSize) {\n // Always use zoom-based calculation for consistent behavior\n const zoomFactor = zoom / 100;\n const scaledWidth = imageSize.width * zoomFactor;\n const scaledHeight = imageSize.height * zoomFactor;\n imgStyle = {\n ...imgStyle,\n width: `${scaledWidth}px`,\n height: `${scaledHeight}px`,\n maxWidth: \"none\",\n maxHeight: \"none\",\n };\n }\n\n return (\n <Box\n component=\"img\"\n ref={imgRef}\n src={imageUrl}\n alt={`${resolvedFileName} page ${currentPage}`}\n onLoad={handleImageLoad}\n onError={() => {\n setError(\"Failed to load image\");\n onError?.(new Error(\"Failed to load image\"));\n }}\n sx={{\n ...imgStyle,\n boxShadow: 1,\n backgroundColor: \"#fff\",\n margin: \"20px\",\n }}\n />\n );\n };\n\n return (\n <Box\n ref={containerRef}\n className={`tiff-viewer ${className}`}\n sx={{\n width,\n height,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n ...style,\n }}\n {...props}\n >\n <Card\n sx={{\n height: \"100%\",\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n elevation={1}\n >\n <CardHeader\n avatar={<FileIcon ext={fileExtension} size={32} />}\n title={\n <Typography variant=\"subtitle1\" fontWeight={500}>\n {resolvedFileName}\n </Typography>\n }\n sx={{ pb: 1 }}\n />\n\n {/* Toolbar - All Controls at Top (Centered) */}\n <Box sx={{ px: 2, pb: 1, display: \"flex\", justifyContent: \"center\" }}>\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n flexWrap=\"wrap\"\n gap={1}\n >\n {/* Page Navigation */}\n {hasMultiplePages && (\n <>\n <IconButton\n size=\"small\"\n onClick={handleFirstPage}\n disabled={currentPage === 1}\n title=\"First Page\"\n aria-label=\"Go to first page\"\n >\n <FirstPageIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n size=\"small\"\n onClick={handlePreviousPage}\n disabled={currentPage === 1}\n title=\"Previous Page\"\n aria-label=\"Go to previous page\"\n >\n <ChevronLeftIcon fontSize=\"small\" />\n </IconButton>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ minWidth: 100, textAlign: \"center\" }}\n >\n Page {currentPage} of {totalPages}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={handleNextPage}\n disabled={currentPage === totalPages}\n title=\"Next Page\"\n aria-label=\"Go to next page\"\n >\n <ChevronRightIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n size=\"small\"\n onClick={handleLastPage}\n disabled={currentPage === totalPages}\n title=\"Last Page\"\n aria-label=\"Go to last page\"\n >\n <LastPageIcon fontSize=\"small\" />\n </IconButton>\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\n </>\n )}\n\n {/* Zoom Controls */}\n <IconButton\n size=\"small\"\n onClick={handleZoomOut}\n disabled={!hasImage || zoom <= 25}\n title=\"Zoom Out\"\n aria-label=\"Zoom out\"\n >\n <ZoomOutIcon fontSize=\"small\" />\n </IconButton>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ minWidth: 64, textAlign: \"center\" }}\n >\n {hasImage ? `${displayScale}%` : \"—\"}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={handleZoomIn}\n disabled={!hasImage || zoom >= 400}\n title=\"Zoom In\"\n aria-label=\"Zoom in\"\n >\n <ZoomInIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n size=\"small\"\n onClick={handleFitWidth}\n disabled={!hasImage}\n title=\"Fit to Width\"\n aria-label=\"Fit to width\"\n color={fitMode === \"fit-width\" ? \"primary\" : \"default\"}\n >\n <AspectRatioIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n size=\"small\"\n onClick={handleFitPage}\n disabled={!hasImage}\n title=\"Fit to Page\"\n aria-label=\"Fit to page\"\n color={fitMode === \"fit-page\" ? \"primary\" : \"default\"}\n >\n <FitScreenIcon fontSize=\"small\" />\n </IconButton>\n\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\n\n {/* Actions */}\n {!toolbar.isHidden(\"download\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"download\", onDownloadClick)}\n disabled={toolbar.isDisabled(\"download\")}\n title={toolbar.getLabel(\"download\") || \"Download\"}\n aria-label=\"Download TIFF\"\n >\n {toolbar.getIcon(\"download\") || (\n <DownloadIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"print\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"print\", onPrintClick)}\n disabled={toolbar.isDisabled(\"print\")}\n title={toolbar.getLabel(\"print\") || \"Print\"}\n aria-label=\"Print TIFF\"\n >\n {toolbar.getIcon(\"print\") || <PrintIcon fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"fullscreen\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\n \"fullscreen\",\n handleToggleFullScreen\n )}\n disabled={toolbar.isDisabled(\"fullscreen\")}\n title={toolbar.getLabel(\"fullscreen\") || \"Fullscreen\"}\n aria-label=\"Toggle fullscreen\"\n >\n {toolbar.getIcon(\"fullscreen\") || (\n <FullscreenIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"metadata\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"metadata\", onMetadataClick)}\n disabled={toolbar.isDisabled(\"metadata\")}\n title={toolbar.getLabel(\"metadata\") || \"Document Metadata\"}\n aria-label=\"View document metadata\"\n >\n {toolbar.getIcon(\"metadata\") || (\n <DescriptionIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"properties\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"properties\", onPropertiesClick)}\n disabled={toolbar.isDisabled(\"properties\")}\n title={toolbar.getLabel(\"properties\") || \"Document Properties\"}\n aria-label=\"View document properties\"\n >\n {toolbar.getIcon(\"properties\") || <InfoIcon fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"tags\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"tags\", onTagsClick)}\n disabled={toolbar.isDisabled(\"tags\")}\n title={toolbar.getLabel(\"tags\") || \"Document Tags\"}\n aria-label=\"View document tags\"\n >\n {toolbar.getIcon(\"tags\") || <LocalOffer fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"history\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"history\", onHistoryClick)}\n disabled={toolbar.isDisabled(\"history\")}\n title={toolbar.getLabel(\"history\") || \"Document History\"}\n aria-label=\"View document history\"\n >\n {toolbar.getIcon(\"history\") || (\n <HistoryIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n </Stack>\n </Box>\n\n {(isLoading || internalLoading) && (\n <LinearProgress sx={{ mx: 3, mb: 1 }} />\n )}\n {error && (\n <Typography color=\"error\" variant=\"body2\" sx={{ px: 3, pb: 1 }}>\n {error}\n </Typography>\n )}\n <Divider />\n <CardContent\n sx={{\n flexGrow: 1,\n flexShrink: 1,\n minHeight: 0,\n p: 0,\n overflow: \"hidden\",\n backgroundColor: \"#f6f8fa\",\n position: \"relative\",\n }}\n >\n <Box\n ref={viewportRef}\n sx={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n overflow: \"auto\",\n }}\n >\n <Box\n sx={{\n minWidth: \"100%\",\n minHeight: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {renderImage()}\n </Box>\n </Box>\n </CardContent>\n </Card>\n </Box>\n );\n};\n\nexport const TIFFViewer: React.FC<FileViewerProps> = (props) => {\n const sourceDescription = useMemo(\n () => resolveDocumentName(props.file, props.fileName, props.url),\n [props.file, props.fileName, props.url]\n );\n\n return <TIFFViewerContent {...props} sourceDescription={sourceDescription} />;\n};\n"],"mappings":"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","names":["imageUrl","url"]}
|
|
@@ -0,0 +1,488 @@
|
|
|
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
|
+
var _chunkECZ6IBOSjs = require('./chunk-ECZ6IBOS.js');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunkEM63H4SAjs = require('./chunk-EM63H4SA.js');
|
|
9
|
+
|
|
10
|
+
// src/components/viewers/ImageViewer.tsx
|
|
11
|
+
var _react = require('react'); var _react2 = _interopRequireDefault(_react);
|
|
12
|
+
|
|
13
|
+
// src/components/viewers/image/ImageToolbar.tsx
|
|
14
|
+
|
|
15
|
+
var _ZoomIn = require('@mui/icons-material/ZoomIn'); var _ZoomIn2 = _interopRequireDefault(_ZoomIn);
|
|
16
|
+
var _ZoomOut = require('@mui/icons-material/ZoomOut'); var _ZoomOut2 = _interopRequireDefault(_ZoomOut);
|
|
17
|
+
var _RotateLeft = require('@mui/icons-material/RotateLeft'); var _RotateLeft2 = _interopRequireDefault(_RotateLeft);
|
|
18
|
+
var _RotateRight = require('@mui/icons-material/RotateRight'); var _RotateRight2 = _interopRequireDefault(_RotateRight);
|
|
19
|
+
var _FitScreen = require('@mui/icons-material/FitScreen'); var _FitScreen2 = _interopRequireDefault(_FitScreen);
|
|
20
|
+
var _AspectRatio = require('@mui/icons-material/AspectRatio'); var _AspectRatio2 = _interopRequireDefault(_AspectRatio);
|
|
21
|
+
var _Fullscreen = require('@mui/icons-material/Fullscreen'); var _Fullscreen2 = _interopRequireDefault(_Fullscreen);
|
|
22
|
+
var _Download = require('@mui/icons-material/Download'); var _Download2 = _interopRequireDefault(_Download);
|
|
23
|
+
var _Print = require('@mui/icons-material/Print'); var _Print2 = _interopRequireDefault(_Print);
|
|
24
|
+
var _Info = require('@mui/icons-material/Info'); var _Info2 = _interopRequireDefault(_Info);
|
|
25
|
+
var _Description = require('@mui/icons-material/Description'); var _Description2 = _interopRequireDefault(_Description);
|
|
26
|
+
var _History = require('@mui/icons-material/History'); var _History2 = _interopRequireDefault(_History);
|
|
27
|
+
var _iconsmaterial = require('@mui/icons-material');
|
|
28
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
29
|
+
var ImageToolbar = _react2.default.memo(
|
|
30
|
+
({
|
|
31
|
+
zoom,
|
|
32
|
+
rotation,
|
|
33
|
+
onZoomIn,
|
|
34
|
+
onZoomOut,
|
|
35
|
+
onFitToWidth,
|
|
36
|
+
onFitToPage,
|
|
37
|
+
onRotateLeft,
|
|
38
|
+
onRotateRight,
|
|
39
|
+
onToggleFullScreen,
|
|
40
|
+
showDownload,
|
|
41
|
+
showPrint,
|
|
42
|
+
showMetadata,
|
|
43
|
+
showTags,
|
|
44
|
+
showProperties,
|
|
45
|
+
showHistory,
|
|
46
|
+
disabledDownload,
|
|
47
|
+
disabledPrint,
|
|
48
|
+
disabledMetadata,
|
|
49
|
+
disabledProperties,
|
|
50
|
+
disabledTags,
|
|
51
|
+
disabledHistory,
|
|
52
|
+
onDownloadClick,
|
|
53
|
+
onPrintClick,
|
|
54
|
+
onTagsClick,
|
|
55
|
+
onMetadataClick,
|
|
56
|
+
onPropertiesClick,
|
|
57
|
+
onHistoryClick
|
|
58
|
+
}) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "pdf-viewer-toolbar", children: [
|
|
59
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "toolbar-separator" }),
|
|
60
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "toolbar-section", children: [
|
|
61
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "button", { className: "toolbar-button", onClick: onZoomOut, title: "Zoom Out", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _ZoomOut2.default, { fontSize: "small" }) }),
|
|
62
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "zoom-display", children: [
|
|
63
|
+
zoom,
|
|
64
|
+
"%"
|
|
65
|
+
] }),
|
|
66
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "button", { className: "toolbar-button", onClick: onZoomIn, title: "Zoom In", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _ZoomIn2.default, { fontSize: "small" }) }),
|
|
67
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
68
|
+
"button",
|
|
69
|
+
{
|
|
70
|
+
className: "toolbar-button",
|
|
71
|
+
onClick: onFitToWidth,
|
|
72
|
+
title: "Fit to Width",
|
|
73
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _AspectRatio2.default, { fontSize: "small" })
|
|
74
|
+
}
|
|
75
|
+
),
|
|
76
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
77
|
+
"button",
|
|
78
|
+
{
|
|
79
|
+
className: "toolbar-button",
|
|
80
|
+
onClick: onFitToPage,
|
|
81
|
+
title: "Fit to Page",
|
|
82
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _FitScreen2.default, { fontSize: "small" })
|
|
83
|
+
}
|
|
84
|
+
)
|
|
85
|
+
] }),
|
|
86
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "toolbar-separator" }),
|
|
87
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "toolbar-section", children: [
|
|
88
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
89
|
+
"button",
|
|
90
|
+
{
|
|
91
|
+
className: "toolbar-button",
|
|
92
|
+
onClick: onRotateLeft,
|
|
93
|
+
title: "Rotate Left",
|
|
94
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _RotateLeft2.default, { fontSize: "small" })
|
|
95
|
+
}
|
|
96
|
+
),
|
|
97
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
98
|
+
"button",
|
|
99
|
+
{
|
|
100
|
+
className: "toolbar-button",
|
|
101
|
+
onClick: onRotateRight,
|
|
102
|
+
title: "Rotate Right",
|
|
103
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _RotateRight2.default, { fontSize: "small" })
|
|
104
|
+
}
|
|
105
|
+
),
|
|
106
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "page-info", children: [
|
|
107
|
+
"Rotation: ",
|
|
108
|
+
rotation,
|
|
109
|
+
"\xB0"
|
|
110
|
+
] })
|
|
111
|
+
] }),
|
|
112
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "toolbar-separator" }),
|
|
113
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "toolbar-section", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
114
|
+
"button",
|
|
115
|
+
{
|
|
116
|
+
className: "toolbar-button",
|
|
117
|
+
onClick: onToggleFullScreen,
|
|
118
|
+
title: "Fullscreen",
|
|
119
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Fullscreen2.default, { fontSize: "small" })
|
|
120
|
+
}
|
|
121
|
+
) }),
|
|
122
|
+
(showDownload || showPrint || showMetadata || showProperties || showTags || showHistory) && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
123
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "toolbar-separator" }),
|
|
124
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "toolbar-section", children: [
|
|
125
|
+
showDownload && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
126
|
+
"button",
|
|
127
|
+
{
|
|
128
|
+
className: "toolbar-button",
|
|
129
|
+
onClick: onDownloadClick,
|
|
130
|
+
disabled: disabledDownload,
|
|
131
|
+
title: "Download Image",
|
|
132
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Download2.default, { fontSize: "small" })
|
|
133
|
+
}
|
|
134
|
+
),
|
|
135
|
+
showPrint && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
136
|
+
"button",
|
|
137
|
+
{
|
|
138
|
+
className: "toolbar-button",
|
|
139
|
+
onClick: onPrintClick,
|
|
140
|
+
disabled: disabledPrint,
|
|
141
|
+
title: "Print Image",
|
|
142
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Print2.default, { fontSize: "small" })
|
|
143
|
+
}
|
|
144
|
+
),
|
|
145
|
+
showMetadata && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
146
|
+
"button",
|
|
147
|
+
{
|
|
148
|
+
className: "toolbar-button",
|
|
149
|
+
onClick: onMetadataClick,
|
|
150
|
+
disabled: disabledMetadata,
|
|
151
|
+
title: "Image Metadata",
|
|
152
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Description2.default, { fontSize: "small" })
|
|
153
|
+
}
|
|
154
|
+
),
|
|
155
|
+
showProperties && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
156
|
+
"button",
|
|
157
|
+
{
|
|
158
|
+
className: "toolbar-button",
|
|
159
|
+
onClick: onPropertiesClick,
|
|
160
|
+
disabled: disabledProperties,
|
|
161
|
+
title: "Image Properties",
|
|
162
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Info2.default, { fontSize: "small" })
|
|
163
|
+
}
|
|
164
|
+
),
|
|
165
|
+
showTags && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
166
|
+
"button",
|
|
167
|
+
{
|
|
168
|
+
className: "toolbar-button",
|
|
169
|
+
onClick: onTagsClick,
|
|
170
|
+
disabled: disabledTags,
|
|
171
|
+
title: "Image Tags",
|
|
172
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _iconsmaterial.LocalOffer, { fontSize: "small" })
|
|
173
|
+
}
|
|
174
|
+
),
|
|
175
|
+
showHistory && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
176
|
+
"button",
|
|
177
|
+
{
|
|
178
|
+
className: "toolbar-button",
|
|
179
|
+
onClick: onHistoryClick,
|
|
180
|
+
disabled: disabledHistory,
|
|
181
|
+
title: "Image History",
|
|
182
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _History2.default, { fontSize: "small" })
|
|
183
|
+
}
|
|
184
|
+
)
|
|
185
|
+
] })
|
|
186
|
+
] })
|
|
187
|
+
] })
|
|
188
|
+
);
|
|
189
|
+
ImageToolbar.displayName = "ImageToolbar";
|
|
190
|
+
|
|
191
|
+
// src/components/viewers/image/ImageHeader.tsx
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
var ImageHeader = _react2.default.memo(({ fileName, fileExtension }) => {
|
|
195
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "pdf-viewer-header", children: [
|
|
196
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkEM63H4SAjs.FileIcon_default, { ext: fileExtension, size: 26 }),
|
|
197
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "header-file-name", title: fileName, children: fileName })
|
|
198
|
+
] });
|
|
199
|
+
});
|
|
200
|
+
ImageHeader.displayName = "ImageHeader";
|
|
201
|
+
|
|
202
|
+
// src/components/viewers/ImageViewer.tsx
|
|
203
|
+
|
|
204
|
+
var ImageViewer = ({
|
|
205
|
+
file,
|
|
206
|
+
url,
|
|
207
|
+
fileName,
|
|
208
|
+
width = "100%",
|
|
209
|
+
height = "100%",
|
|
210
|
+
className = "",
|
|
211
|
+
style = {},
|
|
212
|
+
showDownload = true,
|
|
213
|
+
showPrint = true,
|
|
214
|
+
showMetadata = false,
|
|
215
|
+
showTags = true,
|
|
216
|
+
showProperties = false,
|
|
217
|
+
showHistory = true,
|
|
218
|
+
onDownloadClick,
|
|
219
|
+
onPrintClick,
|
|
220
|
+
onTagsClick,
|
|
221
|
+
onMetadataClick,
|
|
222
|
+
onPropertiesClick,
|
|
223
|
+
onHistoryClick,
|
|
224
|
+
// Extract props that shouldn't be passed to DOM elements
|
|
225
|
+
mimeType,
|
|
226
|
+
fileSize,
|
|
227
|
+
showPageCount,
|
|
228
|
+
showPageNavigation,
|
|
229
|
+
showZoomControls,
|
|
230
|
+
showSearch,
|
|
231
|
+
customRegistry,
|
|
232
|
+
initialSearchText,
|
|
233
|
+
initialSearchPages,
|
|
234
|
+
autoOpenSearch,
|
|
235
|
+
autoExecuteSearch,
|
|
236
|
+
onSearchComplete,
|
|
237
|
+
toolbarActions,
|
|
238
|
+
...props
|
|
239
|
+
}) => {
|
|
240
|
+
const containerRef = _react.useRef.call(void 0, null);
|
|
241
|
+
const imageAreaRef = _react.useRef.call(void 0, null);
|
|
242
|
+
const [imageSize, setImageSize] = _react.useState.call(void 0, { width: 0, height: 0 });
|
|
243
|
+
const [zoom, setZoom] = _react.useState.call(void 0, 100);
|
|
244
|
+
const [rotation, setRotation] = _react.useState.call(void 0, 0);
|
|
245
|
+
const [pendingFit, setPendingFit] = _react.useState.call(void 0, null);
|
|
246
|
+
const didAutoFit = _react.useRef.call(void 0, false);
|
|
247
|
+
const [isDragging, setIsDragging] = _react.useState.call(void 0, false);
|
|
248
|
+
const [dragStart, setDragStart] = _react.useState.call(void 0, { x: 0, y: 0 });
|
|
249
|
+
const [scrollStart, setScrollStart] = _react.useState.call(void 0, { left: 0, top: 0 });
|
|
250
|
+
const [isFullScreen, setIsFullScreen] = _react.useState.call(void 0, false);
|
|
251
|
+
const src = _react.useMemo.call(void 0, () => {
|
|
252
|
+
if (file) {
|
|
253
|
+
const objectUrl = URL.createObjectURL(file);
|
|
254
|
+
return objectUrl;
|
|
255
|
+
}
|
|
256
|
+
return url || "";
|
|
257
|
+
}, [file, url]);
|
|
258
|
+
_react.useEffect.call(void 0, () => {
|
|
259
|
+
return () => {
|
|
260
|
+
if (file && src) {
|
|
261
|
+
URL.revokeObjectURL(src);
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
}, [file, src]);
|
|
265
|
+
const handleImageLoad = (e) => {
|
|
266
|
+
const img = e.currentTarget;
|
|
267
|
+
setImageSize({ width: img.naturalWidth, height: img.naturalHeight });
|
|
268
|
+
if (!didAutoFit.current) {
|
|
269
|
+
setPendingFit("page");
|
|
270
|
+
didAutoFit.current = true;
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
_react.useEffect.call(void 0, () => {
|
|
274
|
+
if (!imageAreaRef.current || !imageSize.width || !imageSize.height || !pendingFit)
|
|
275
|
+
return;
|
|
276
|
+
const containerWidth = imageAreaRef.current.offsetWidth;
|
|
277
|
+
const containerHeight = imageAreaRef.current.offsetHeight;
|
|
278
|
+
const rot2 = rotation % 360;
|
|
279
|
+
const rotated2 = rot2 === 90 || rot2 === 270;
|
|
280
|
+
const imgW = rotated2 ? imageSize.height : imageSize.width;
|
|
281
|
+
const imgH = rotated2 ? imageSize.width : imageSize.height;
|
|
282
|
+
if (pendingFit === "width") {
|
|
283
|
+
setZoom(Math.round(containerWidth / imgW * 100));
|
|
284
|
+
} else if (pendingFit === "page") {
|
|
285
|
+
const scaleW = containerWidth / imgW;
|
|
286
|
+
const scaleH = containerHeight / imgH;
|
|
287
|
+
setZoom(Math.round(Math.min(scaleW, scaleH) * 100));
|
|
288
|
+
}
|
|
289
|
+
setPendingFit(null);
|
|
290
|
+
}, [pendingFit, imageSize, rotation]);
|
|
291
|
+
const handleZoomIn = () => setZoom((z) => Math.min(z + 10, 400));
|
|
292
|
+
const handleZoomOut = () => setZoom((z) => Math.max(z - 10, 10));
|
|
293
|
+
const handleFitToWidth = () => setPendingFit("width");
|
|
294
|
+
const handleFitToPage = () => setPendingFit("page");
|
|
295
|
+
const handleRotateLeft = () => setRotation((r) => (r - 90 + 360) % 360);
|
|
296
|
+
const handleRotateRight = () => setRotation((r) => (r + 90) % 360);
|
|
297
|
+
const handleToggleFullScreen = () => {
|
|
298
|
+
if (!isFullScreen && _optionalChain([containerRef, 'access', _ => _.current, 'optionalAccess', _2 => _2.requestFullscreen])) {
|
|
299
|
+
containerRef.current.requestFullscreen();
|
|
300
|
+
setIsFullScreen(true);
|
|
301
|
+
} else if (isFullScreen && document.exitFullscreen) {
|
|
302
|
+
document.exitFullscreen();
|
|
303
|
+
setIsFullScreen(false);
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
const handleMouseDown = (e) => {
|
|
307
|
+
if (imageAreaRef.current) {
|
|
308
|
+
setIsDragging(true);
|
|
309
|
+
setDragStart({ x: e.clientX, y: e.clientY });
|
|
310
|
+
setScrollStart({
|
|
311
|
+
left: imageAreaRef.current.scrollLeft,
|
|
312
|
+
top: imageAreaRef.current.scrollTop
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
const handleMouseMove = (e) => {
|
|
317
|
+
if (!isDragging || !imageAreaRef.current) return;
|
|
318
|
+
const dx = e.clientX - dragStart.x;
|
|
319
|
+
const dy = e.clientY - dragStart.y;
|
|
320
|
+
imageAreaRef.current.scrollLeft = scrollStart.left - dx;
|
|
321
|
+
imageAreaRef.current.scrollTop = scrollStart.top - dy;
|
|
322
|
+
};
|
|
323
|
+
const handleMouseUp = () => setIsDragging(false);
|
|
324
|
+
const handleMouseLeave = () => setIsDragging(false);
|
|
325
|
+
const toolbar = _chunkEM63H4SAjs.mergeToolbarConfig.call(void 0, {
|
|
326
|
+
showDownload,
|
|
327
|
+
showPrint,
|
|
328
|
+
showMetadata,
|
|
329
|
+
showTags,
|
|
330
|
+
showProperties,
|
|
331
|
+
showHistory,
|
|
332
|
+
onDownloadClick,
|
|
333
|
+
onPrintClick,
|
|
334
|
+
onTagsClick,
|
|
335
|
+
onMetadataClick,
|
|
336
|
+
onPropertiesClick,
|
|
337
|
+
onHistoryClick,
|
|
338
|
+
toolbarActions
|
|
339
|
+
});
|
|
340
|
+
_react.useEffect.call(void 0, () => {
|
|
341
|
+
const handleKeyDown = (e) => {
|
|
342
|
+
if (e.key === "+") setZoom((z) => Math.min(z + 10, 400));
|
|
343
|
+
if (e.key === "-") setZoom((z) => Math.max(z - 10, 10));
|
|
344
|
+
if (e.key === "r") setRotation((r) => (r + 90) % 360);
|
|
345
|
+
if (e.key === "R") setRotation((r) => (r - 90 + 360) % 360);
|
|
346
|
+
if (e.key === "Escape" && isFullScreen && document.exitFullscreen) {
|
|
347
|
+
document.exitFullscreen();
|
|
348
|
+
setIsFullScreen(false);
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
const handleFullscreenChange = () => {
|
|
352
|
+
setIsFullScreen(!!document.fullscreenElement);
|
|
353
|
+
};
|
|
354
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
355
|
+
document.addEventListener("fullscreenchange", handleFullscreenChange);
|
|
356
|
+
return () => {
|
|
357
|
+
window.removeEventListener("keydown", handleKeyDown);
|
|
358
|
+
document.removeEventListener("fullscreenchange", handleFullscreenChange);
|
|
359
|
+
};
|
|
360
|
+
}, [isFullScreen]);
|
|
361
|
+
if (!src) {
|
|
362
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "pdf-viewer-container", style: { width, height, ...style }, children: [
|
|
363
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "style", { children: _chunkECZ6IBOSjs.toolbarStyles }),
|
|
364
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
365
|
+
"div",
|
|
366
|
+
{
|
|
367
|
+
style: {
|
|
368
|
+
height: "100%",
|
|
369
|
+
display: "flex",
|
|
370
|
+
alignItems: "center",
|
|
371
|
+
justifyContent: "center",
|
|
372
|
+
color: "#666"
|
|
373
|
+
},
|
|
374
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "strong", { children: "No image source provided" })
|
|
375
|
+
}
|
|
376
|
+
)
|
|
377
|
+
] });
|
|
378
|
+
}
|
|
379
|
+
const displayName = fileName || _optionalChain([file, 'optionalAccess', _3 => _3.name]) || "image";
|
|
380
|
+
const ext = displayName.split(".").pop() || "";
|
|
381
|
+
const rot = rotation % 360;
|
|
382
|
+
const rotated = rot === 90 || rot === 270;
|
|
383
|
+
const displayWidth = rotated ? imageSize.height : imageSize.width;
|
|
384
|
+
const displayHeight = rotated ? imageSize.width : imageSize.height;
|
|
385
|
+
const scaledWidth = displayWidth * (zoom / 100);
|
|
386
|
+
const scaledHeight = displayHeight * (zoom / 100);
|
|
387
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
388
|
+
"div",
|
|
389
|
+
{
|
|
390
|
+
ref: containerRef,
|
|
391
|
+
className: "pdf-viewer-container",
|
|
392
|
+
style: { width, height, ...style },
|
|
393
|
+
children: [
|
|
394
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "style", { children: _chunkECZ6IBOSjs.toolbarStyles }),
|
|
395
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, ImageHeader, { fileName: displayName, fileExtension: ext }),
|
|
396
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
397
|
+
ImageToolbar,
|
|
398
|
+
{
|
|
399
|
+
zoom,
|
|
400
|
+
rotation,
|
|
401
|
+
onZoomIn: handleZoomIn,
|
|
402
|
+
onZoomOut: handleZoomOut,
|
|
403
|
+
onFitToWidth: handleFitToWidth,
|
|
404
|
+
onFitToPage: handleFitToPage,
|
|
405
|
+
onRotateLeft: handleRotateLeft,
|
|
406
|
+
onRotateRight: handleRotateRight,
|
|
407
|
+
onToggleFullScreen: handleToggleFullScreen,
|
|
408
|
+
showDownload: !toolbar.isHidden("download"),
|
|
409
|
+
showPrint: !toolbar.isHidden("print"),
|
|
410
|
+
showMetadata: !toolbar.isHidden("metadata"),
|
|
411
|
+
showProperties: !toolbar.isHidden("properties"),
|
|
412
|
+
showTags: !toolbar.isHidden("tags"),
|
|
413
|
+
showHistory: !toolbar.isHidden("history"),
|
|
414
|
+
disabledDownload: toolbar.isDisabled("download"),
|
|
415
|
+
disabledPrint: toolbar.isDisabled("print"),
|
|
416
|
+
disabledMetadata: toolbar.isDisabled("metadata"),
|
|
417
|
+
disabledProperties: toolbar.isDisabled("properties"),
|
|
418
|
+
disabledTags: toolbar.isDisabled("tags"),
|
|
419
|
+
disabledHistory: toolbar.isDisabled("history"),
|
|
420
|
+
onDownloadClick: toolbar.getHandler("download", onDownloadClick),
|
|
421
|
+
onPrintClick: toolbar.getHandler("print", onPrintClick),
|
|
422
|
+
onMetadataClick: toolbar.getHandler("metadata", onMetadataClick),
|
|
423
|
+
onPropertiesClick: toolbar.getHandler("properties", onPropertiesClick),
|
|
424
|
+
onTagsClick: toolbar.getHandler("tags", onTagsClick),
|
|
425
|
+
onHistoryClick: toolbar.getHandler("history", onHistoryClick)
|
|
426
|
+
}
|
|
427
|
+
),
|
|
428
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
429
|
+
"div",
|
|
430
|
+
{
|
|
431
|
+
ref: imageAreaRef,
|
|
432
|
+
className: "pdf-viewer-content",
|
|
433
|
+
style: {
|
|
434
|
+
cursor: isDragging ? "grabbing" : "grab",
|
|
435
|
+
overflow: "auto",
|
|
436
|
+
background: "#f5f5f5"
|
|
437
|
+
},
|
|
438
|
+
onMouseDown: handleMouseDown,
|
|
439
|
+
onMouseMove: handleMouseMove,
|
|
440
|
+
onMouseUp: handleMouseUp,
|
|
441
|
+
onMouseLeave: handleMouseLeave,
|
|
442
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
443
|
+
"div",
|
|
444
|
+
{
|
|
445
|
+
style: {
|
|
446
|
+
minWidth: `${scaledWidth}px`,
|
|
447
|
+
minHeight: `${scaledHeight}px`,
|
|
448
|
+
width: `${scaledWidth}px`,
|
|
449
|
+
height: `${scaledHeight}px`,
|
|
450
|
+
margin: "auto",
|
|
451
|
+
display: "flex",
|
|
452
|
+
alignItems: "center",
|
|
453
|
+
justifyContent: "center",
|
|
454
|
+
position: "relative"
|
|
455
|
+
},
|
|
456
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
457
|
+
"img",
|
|
458
|
+
{
|
|
459
|
+
src,
|
|
460
|
+
alt: displayName,
|
|
461
|
+
onLoad: handleImageLoad,
|
|
462
|
+
crossOrigin: "anonymous",
|
|
463
|
+
style: {
|
|
464
|
+
transform: `rotate(${rotation}deg)`,
|
|
465
|
+
transformOrigin: "center center",
|
|
466
|
+
maxWidth: "100%",
|
|
467
|
+
maxHeight: "100%",
|
|
468
|
+
width: "100%",
|
|
469
|
+
height: "100%",
|
|
470
|
+
objectFit: "contain",
|
|
471
|
+
pointerEvents: "none",
|
|
472
|
+
userSelect: "none"
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
)
|
|
476
|
+
}
|
|
477
|
+
)
|
|
478
|
+
}
|
|
479
|
+
)
|
|
480
|
+
]
|
|
481
|
+
}
|
|
482
|
+
);
|
|
483
|
+
};
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
exports.ImageViewer = ImageViewer;
|
|
488
|
+
//# sourceMappingURL=chunk-QV63FULE.js.map
|