diff options
Diffstat (limited to 'components')
| -rw-r--r-- | components/file-manager/FileManager.tsx | 1 | ||||
| -rw-r--r-- | components/file-manager/SecurePDFViewer.tsx | 101 | ||||
| -rw-r--r-- | components/file-manager/creaetWaterMarks.tsx | 4 | ||||
| -rw-r--r-- | components/layout/Footer.tsx | 6 | ||||
| -rw-r--r-- | components/layout/Header.tsx | 10 | ||||
| -rw-r--r-- | components/layout/HeaderDataroom.tsx | 7 |
6 files changed, 73 insertions, 56 deletions
diff --git a/components/file-manager/FileManager.tsx b/components/file-manager/FileManager.tsx index 7c5a3771..a95d8c06 100644 --- a/components/file-manager/FileManager.tsx +++ b/components/file-manager/FileManager.tsx @@ -1962,6 +1962,7 @@ export function FileManager({ projectId }: FileManagerProps) { <SecurePDFViewer documentUrl={viewerFileUrl} fileName={selectedFile.name} + category={selectedFile.category} onClose={() => { setViewerDialogOpen(false); setViewerFileUrl(null); diff --git a/components/file-manager/SecurePDFViewer.tsx b/components/file-manager/SecurePDFViewer.tsx index bd28214b..a24e2e37 100644 --- a/components/file-manager/SecurePDFViewer.tsx +++ b/components/file-manager/SecurePDFViewer.tsx @@ -10,10 +10,11 @@ import { createCustomWatermark } from './creaetWaterMarks'; interface SecurePDFViewerProps { documentUrl: string; fileName: string; + category?: string; onClose?: () => void; } -export function SecurePDFViewer({ documentUrl, fileName, onClose }: SecurePDFViewerProps) { +export function SecurePDFViewer({ documentUrl, fileName, category, onClose }: SecurePDFViewerProps) { const viewerRef = useRef<HTMLDivElement>(null); const instanceRef = useRef<WebViewerInstance | null>(null); const initialized = useRef(false); @@ -91,6 +92,10 @@ export function SecurePDFViewer({ documentUrl, fileName, onClose }: SecurePDFVie 'toggleNotesButton' ]); + const { Core } = instance; + Core.Tools.Tool.disableAutoSwitch(); + Core.Tools.Tool.disableTextSelection(); + // CSS 적용으로 추가 보안 const iframeWindow = instance.UI.iframeWindow; if (iframeWindow && iframeWindow.document) { @@ -187,55 +192,57 @@ export function SecurePDFViewer({ documentUrl, fileName, onClose }: SecurePDFVie const { documentViewer, annotationManager } = instance.Core; - // 문서 로드 완료 이벤트 - documentViewer.addEventListener('documentLoaded', async () => { - setIsLoading(false); - - // 워터마크 추가 - const watermarkText = `SHI DATAROOM\n${session?.user?.email || 'CONFIDENTIAL'}\n${new Date().toLocaleString()}`; - - // 대각선 워터마크 - documentViewer.setWatermark({ - custom: createCustomWatermark({ - text: watermarkText, - fontSize: 14, - fontFamily: 'Arial', - color: 'rgba(128, 128, 128, 0.3)', // 연한 회색 - opacity: 30, // 15% 투명도 - rotation: -45, - }) - }); + if (category !== 'public') { + // 문서 로드 완료 이벤트 + documentViewer.addEventListener('documentLoaded', async () => { + setIsLoading(false); + + // 워터마크 추가 + const watermarkText = `SHI DATAROOM\n${session?.user?.email || 'CONFIDENTIAL'}\n${new Date().toLocaleString()}`; + + // 대각선 워터마크 + documentViewer.setWatermark({ + custom: createCustomWatermark({ + text: watermarkText, + fontSize: 14, + fontFamily: 'Arial', + color: 'rgba(128, 128, 128, 0.5)', // 연한 회색 + opacity: 30, // 15% 투명도 + rotation: -45, + }) + }); - // 각 페이지에 커스텀 워터마크 추가 - const pageCount = documentViewer.getPageCount(); - for (let i = 1; i <= pageCount; i++) { - const pageInfo = documentViewer.getDocument().getPageInfo(i); - const { width, height } = pageInfo; - - // FreeTextAnnotation 생성 - const watermarkAnnot = new instance.Core.Annotations.FreeTextAnnotation(); - watermarkAnnot.PageNumber = i; - watermarkAnnot.X = width / 4; - watermarkAnnot.Y = height / 2; - watermarkAnnot.Width = width / 2; - watermarkAnnot.Height = 100; - watermarkAnnot.setContents( - `${session?.user?.email}\n${docFileName}\n${new Date().toLocaleDateString()}` - ); - watermarkAnnot.FillColor = new instance.Core.Annotations.Color(255, 0, 0, 0.3); - watermarkAnnot.TextColor = new instance.Core.Annotations.Color(255, 0, 0, 0.4); - watermarkAnnot.FontSize = '24pt'; - watermarkAnnot.TextAlign = 'center'; - watermarkAnnot.Rotation = -45; - watermarkAnnot.ReadOnly = true; - watermarkAnnot.Locked = true; - watermarkAnnot.Printable = true; - - annotationManager.addAnnotation(watermarkAnnot); + // 각 페이지에 커스텀 워터마크 추가 + const pageCount = documentViewer.getPageCount(); + for (let i = 1; i <= pageCount; i++) { + const pageInfo = documentViewer.getDocument().getPageInfo(i); + const { width, height } = pageInfo; + + // FreeTextAnnotation 생성 + const watermarkAnnot = new instance.Core.Annotations.FreeTextAnnotation(); + watermarkAnnot.PageNumber = i; + watermarkAnnot.X = width / 4; + watermarkAnnot.Y = height / 2; + watermarkAnnot.Width = width / 2; + watermarkAnnot.Height = 100; + watermarkAnnot.setContents( + `${session?.user?.email}\n${docFileName}\n${new Date().toLocaleDateString()}` + ); + watermarkAnnot.FillColor = new instance.Core.Annotations.Color(255, 0, 0, 0.3); + watermarkAnnot.TextColor = new instance.Core.Annotations.Color(255, 0, 0, 0.4); + watermarkAnnot.FontSize = '24pt'; + watermarkAnnot.TextAlign = 'center'; + watermarkAnnot.Rotation = -45; + watermarkAnnot.ReadOnly = true; + watermarkAnnot.Locked = true; + watermarkAnnot.Printable = true; + + annotationManager.addAnnotation(watermarkAnnot); + } + + annotationManager.drawAnnotations(documentViewer.getCurrentPage()); } - annotationManager.drawAnnotations(documentViewer.getCurrentPage()); - // Pan 모드로 설정 (텍스트 선택 불가) documentViewer.setToolMode(documentViewer.getTool('Pan')); diff --git a/components/file-manager/creaetWaterMarks.tsx b/components/file-manager/creaetWaterMarks.tsx index ebf4322e..642e5e2a 100644 --- a/components/file-manager/creaetWaterMarks.tsx +++ b/components/file-manager/creaetWaterMarks.tsx @@ -1,7 +1,7 @@ export const createCustomWatermark: CreateCustomWatermark = ({ text, fontSize = 14, - color = "rgba(128, 128, 128, 0.3)", // 더 연한 회색, 더 투명하게 + color = "rgba(128, 128, 128, 0.5)", // 더 연한 회색, 더 투명하게 opacity = 30, // 더 낮은 opacity rotation = -45, fontFamily = "Arial", @@ -30,7 +30,7 @@ export const createCustomWatermark: CreateCustomWatermark = ({ const textBlockHeight = lines.length * lineHeight; // 격자 간격 계산 (텍스트 블록 크기 기반) - const horizontalSpacing = maxLineWidth * 0.8; // 가로 간격 + const horizontalSpacing = maxLineWidth * 1.2; // 가로 간격 const verticalSpacing = textBlockHeight * 1.5; // 세로 간격 // 회전을 고려한 대각선 길이 계산 diff --git a/components/layout/Footer.tsx b/components/layout/Footer.tsx index bf533ae8..33278d7e 100644 --- a/components/layout/Footer.tsx +++ b/components/layout/Footer.tsx @@ -11,11 +11,15 @@ export function SiteFooter() { <footer className="border-grid border-t py-6 md:px-8 md:py-0"> <div className="container-wrapper"> <div className="container py-4"> - <div className="text-balance text-center text-sm leading-loose text-muted-foreground md:text-left"> + {/* <div className="text-balance text-center text-sm leading-loose text-muted-foreground md:text-left"> {isDataRoom ? "Data Room - 삼성중공업 데이터룸" : "enterprise Vendor Co-work Platform - 삼성중공업 전사벤더협업플랫폼" } + </div> */} + + <div className="text-balance text-center text-sm leading-loose text-muted-foreground md:text-left"> + CONPORT </div> </div> </div> diff --git a/components/layout/Header.tsx b/components/layout/Header.tsx index a080d394..db9c6b49 100644 --- a/components/layout/Header.tsx +++ b/components/layout/Header.tsx @@ -161,14 +161,14 @@ export function Header() { <Link href={logoHref} className="flex items-center gap-2"> <Image className="dark:invert" - src="/images/vercel.svg" - alt="EVCP Logo" - width={20} + src="/images/Logotype.svg" + alt="Logo" + width={120} height={20} /> - <span className="hidden font-bold lg:inline-block"> + {/* <span className="hidden font-bold lg:inline-block"> {t(brandNameKey)} - </span> + </span> */} </Link> </div> diff --git a/components/layout/HeaderDataroom.tsx b/components/layout/HeaderDataroom.tsx index fa9b89cf..0981b24b 100644 --- a/components/layout/HeaderDataroom.tsx +++ b/components/layout/HeaderDataroom.tsx @@ -138,7 +138,12 @@ export function HeaderDataRoom() { <Link href={`/${lng}/evcp/settings`}>설정</Link> </DropdownMenuItem> <DropdownMenuSeparator /> - <DropdownMenuItem onSelect={() => signOut({ callbackUrl: `/${lng}/${domain}` })}> + <DropdownMenuItem onSelect={() => { + const logoutUrl = domain === 'partners' + ? 'https://shidataroom.com/en/partners' + : `/${lng}/${domain}`; + signOut({ callbackUrl: logoutUrl }); + }}> 로그아웃 </DropdownMenuItem> </DropdownMenuContent> |
