From 536dd6b569c05c701db992471c511fef59779f65 Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Tue, 16 Jun 2026 14:52:25 +0700 Subject: [PATCH] =?UTF-8?q?[CLAUDE]=20FE-PE:=20Link=20h=E1=BB=93=20s=C6=A1?= =?UTF-8?q?=20=E1=BB=95=20m=E1=BA=A1ng=20=E2=80=94=20render=20link=20file:?= =?UTF-8?q?//=20b=E1=BA=A5m-th=E1=BB=AD=20m=E1=BB=9F=20Explorer=20+=20gi?= =?UTF-8?q?=E1=BB=AF=20Copy=20d=E1=BB=B1=20ph=C3=B2ng=20(x2=20app=20SHA256?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- fe-admin/src/components/pe/PeDetailTabs.tsx | 30 ++++++++++++++++----- fe-user/src/components/pe/PeDetailTabs.tsx | 30 ++++++++++++++++----- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/fe-admin/src/components/pe/PeDetailTabs.tsx b/fe-admin/src/components/pe/PeDetailTabs.tsx index fc44fc0..46215c1 100644 --- a/fe-admin/src/components/pe/PeDetailTabs.tsx +++ b/fe-admin/src/components/pe/PeDetailTabs.tsx @@ -1444,8 +1444,9 @@ function HoSoLinkRow({ ev, readOnly = false }: { ev: PeDetailBundle; readOnly?: {ev.hoSoLink} ) : ( - // Đường dẫn ổ cứng/ổ mạng (O:\…, \\server) → trình duyệt CHẶN mở file:// - // từ https nên bấm sẽ hụt → hiện chữ + nút Copy để dán vào File Explorer. + // Đường dẫn ổ cứng/ổ mạng (O:\…, \\server) → render link file:// để BẤM-THỬ + // mở File Explorer (chạy nếu máy/trình duyệt cho phép, vd máy domain map sẵn + // ổ mạng) + nút Copy dự phòng (default Chrome chặn https→file:// thì dùng Copy). ) ) : ( @@ -1456,9 +1457,18 @@ function HoSoLinkRow({ ev, readOnly = false }: { ev: PeDetailBundle; readOnly?: ) } -// e.bis — Đường dẫn ổ cứng/ổ mạng (không phải http) → chữ + nút Copy. Trình duyệt -// CHẶN mở file:// từ trang https nên KHÔNG render bấm-mở (bấm sẽ hụt); thay -// bằng Copy → người dùng dán vào File Explorer (máy có map ổ mạng là mở ngay). +// Đổi đường dẫn Windows → URL file:// (O:\DATA\x → file:///O:/DATA/x · \\srv\share → file://srv/share). +function toFileUrl(p: string): string { + const slashed = p.trim().replace(/\\/g, '/') + const url = slashed.startsWith('//') ? 'file:' + slashed : 'file:///' + slashed + return encodeURI(url) +} + +// e.bis — Đường dẫn ổ cứng/ổ mạng (không phải http). Render LINK file:// để BẤM-THỬ +// mở File Explorer + nút Copy dự phòng. Bấm-mở chỉ chạy khi máy được cấu hình: +// Edge bật policy IntranetFileLinksEnabled (GPO 1 lần/domain, KHÔNG cài per-máy) + +// host trong Intranet Zone. Default Chrome/Edge CHẶN https→file:// (bấm no-op) → +// khi đó dùng nút Copy dán vào File Explorer (máy đã map ổ mạng là mở ngay). function PathWithCopy({ path }: { path: string }) { const [copied, setCopied] = useState(false) const copy = async () => { @@ -1472,9 +1482,15 @@ function PathWithCopy({ path }: { path: string }) { } return (
- + {path} - +