@indora-labs/redaction-react 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/README.md +2 -0
- package/dist/index.d.mts +191 -0
- package/dist/index.d.ts +191 -0
- package/dist/index.js +1079 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1047 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/DocumentRedactionViewer.tsx","../src/components/FileViewer.tsx","../src/components/PdfRedactionViewer.tsx","../src/components/RedactionInspector.tsx"],"sourcesContent":["export * from './types';\nexport * from './components';\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\n/* ============================================================================\n * Shared types (match your backend shapes)\n * ========================================================================== */\n\nexport type SpanAttribution = {\n source: \"policy\" | \"manual\";\n policyId: string | null;\n ruleType: \"REDACT\" | \"DETECT\" | \"EXCLUDE\" | null;\n sourceText: string | null;\n target: string;\n};\n\nexport type Span = {\n start: number;\n end: number;\n label: string;\n attributions: SpanAttribution[];\n};\n\nexport type Rect = {\n id: string; // ADD THIS\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n label: string;\n type?: string;\n reason?: string;\n};\n\nexport type OcrWordBox = {\n x: number;\n y: number;\n w: number;\n h: number;\n str: string;\n start: number;\n end: number;\n};\n\nexport type DocumentPage = {\n page: number;\n /** Background surface. Keep it simple for portability. */\n imageUrl: string;\n /** Intrinsic size used to interpret x/y/w/h (your rect units). */\n width: number;\n height: number;\n};\n\n/* ============================================================================\n * Component props\n * ========================================================================== */\n\nexport type DocumentRedactionViewerProps = {\n pages: DocumentPage[];\n\n /** Optional OCR word boxes to allow \"text highlight\" style selection. */\n ocrByPage?: Record<number, OcrWordBox[]>;\n\n /** Existing rects to render/edit. */\n rects: Rect[];\n\n /** Called whenever user creates/moves/resizes rects. */\n onRectsChange: (next: Rect[]) => void;\n\n /** Called when user selects a rect (optional). */\n onRectSelect?: (rect: Rect | null) => void;\n selectedRectId?: string | null;\n\n /** Create rect label (optional). */\n defaultRectLabel?: string;\n\n /** If true, user can draw/create new rects. */\n allowCreate?: boolean;\n\n /** If true, user can move/resize rects. */\n allowEdit?: boolean;\n\n /** Viewer scale. (1 = native page units) */\n zoom?: number;\n\n /** Styling hooks */\n className?: string;\n style?: React.CSSProperties;\n\n /** If provided, restrict selection to these pages. */\n pageFilter?: (page: DocumentPage) => boolean;\n\n /**\n * If you want the selection behavior to create a rect even without OCR,\n * set this true (will create a freeform drag-rectangle).\n */\n allowFreeformDragCreate?: boolean;\n};\n\ntype Point = { x: number; y: number };\n\ntype DragMode =\n | { kind: \"none\" }\n | { kind: \"selecting\"; page: number; startPt: Point; curPt: Point; wordIds: number[] }\n | { kind: \"freeform\"; page: number; startPt: Point; curPt: Point }\n | { kind: \"moving\"; index: number; page: number; startPt: Point; startRect: Rect }\n | { kind: \"resizing\"; index: number; page: number; handle: ResizeHandle; startPt: Point; startRect: Rect };\n\ntype ResizeHandle =\n | \"n\"\n | \"s\"\n | \"e\"\n | \"w\"\n | \"ne\"\n | \"nw\"\n | \"se\"\n | \"sw\";\n\ntype PageDomMap = Record<number, HTMLDivElement | null>;\n\n/* ============================================================================\n * Utilities\n * ========================================================================== */\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, v));\n}\n\nfunction rectNormalize(x1: number, y1: number, x2: number, y2: number): { x: number; y: number; w: number; h: number } {\n const x = Math.min(x1, x2);\n const y = Math.min(y1, y2);\n const w = Math.abs(x2 - x1);\n const h = Math.abs(y2 - y1);\n return { x, y, w, h };\n}\n\nfunction unionBoxes(boxes: Array<{ x: number; y: number; w: number; h: number }>): { x: number; y: number; w: number; h: number } | null {\n if (boxes.length === 0) return null;\n let minX = boxes[0].x;\n let minY = boxes[0].y;\n let maxX = boxes[0].x + boxes[0].w;\n let maxY = boxes[0].y + boxes[0].h;\n\n for (let i = 1; i < boxes.length; i++) {\n minX = Math.min(minX, boxes[i].x);\n minY = Math.min(minY, boxes[i].y);\n maxX = Math.max(maxX, boxes[i].x + boxes[i].w);\n maxY = Math.max(maxY, boxes[i].y + boxes[i].h);\n }\n\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };\n}\n\nfunction hitTestWord(pt: Point, w: OcrWordBox): boolean {\n return pt.x >= w.x && pt.x <= w.x + w.w && pt.y >= w.y && pt.y <= w.y + w.h;\n}\n\nfunction hitTestRect(pt: Point, r: Rect): boolean {\n return pt.x >= r.x && pt.x <= r.x + r.w && pt.y >= r.y && pt.y <= r.y + r.h;\n}\n\n/** Compute which handle is hit, given point and rect. */\nfunction hitTestHandle(pt: Point, r: Rect, handleSize: number): ResizeHandle | null {\n const hs = handleSize;\n const left = r.x;\n const right = r.x + r.w;\n const top = r.y;\n const bottom = r.y + r.h;\n const cx = r.x + r.w / 2;\n const cy = r.y + r.h / 2;\n\n const handles: Array<{ h: ResizeHandle; x: number; y: number }> = [\n { h: \"nw\", x: left, y: top },\n { h: \"n\", x: cx, y: top },\n { h: \"ne\", x: right, y: top },\n { h: \"e\", x: right, y: cy },\n { h: \"se\", x: right, y: bottom },\n { h: \"s\", x: cx, y: bottom },\n { h: \"sw\", x: left, y: bottom },\n { h: \"w\", x: left, y: cy },\n ];\n\n for (const hh of handles) {\n const dx = Math.abs(pt.x - hh.x);\n const dy = Math.abs(pt.y - hh.y);\n if (dx <= hs && dy <= hs) return hh.h;\n }\n return null;\n}\n\n/* ============================================================================\n * DocumentRedactionViewer\n * ========================================================================== */\n\nexport const DocumentRedactionViewer: React.FC<DocumentRedactionViewerProps> = ({\n pages,\n ocrByPage,\n rects,\n onRectsChange,\n onRectSelect,\n selectedRectId,\n defaultRectLabel = \"REDACT\",\n allowCreate = true,\n allowEdit = true,\n zoom = 1,\n className,\n style,\n pageFilter,\n allowFreeformDragCreate = false,\n}) => {\n const pageRefs = useRef<PageDomMap>({});\n const pointerIdRef = useRef<number | null>(null);\n\n const selectedId = selectedRectId ?? null;\n const isAnySelected = selectedId !== null;\n const [drag, setDrag] = useState<DragMode>({ kind: \"none\" });\n\n const visiblePages = useMemo(() => {\n const filtered = pageFilter ? pages.filter(pageFilter) : pages;\n return filtered.slice().sort((a, b) => a.page - b.page);\n }, [pages, pageFilter]);\n\n const selectedRect = useMemo(\n () => rects.find(r => r.id === selectedId) ?? null,\n [rects, selectedId]\n );\n\n\n // Keep parent informed of selection (optional)\n useEffect(() => {\n if (!onRectSelect) return;\n onRectSelect(selectedRect);\n }, [selectedId, selectedRect, onRectSelect]);\n\n const setPageRef = useCallback((page: number, el: HTMLDivElement | null) => {\n pageRefs.current[page] = el;\n }, []);\n\n const clientToPagePoint = useCallback(\n (page: DocumentPage, clientX: number, clientY: number): Point | null => {\n const el = pageRefs.current[page.page];\n if (!el) return null;\n const b = el.getBoundingClientRect();\n\n const x = (clientX - b.left) / zoom;\n const y = (clientY - b.top) / zoom;\n\n // clamp into page\n return {\n x: clamp(x, 0, page.width),\n y: clamp(y, 0, page.height),\n };\n },\n [zoom]\n );\n\n const commitRects = useCallback(\n (next: Rect[]) => {\n onRectsChange(next);\n },\n [onRectsChange]\n );\n\n function generateRectId(): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n\n // Fallback: time + randomness (still plenty safe for UI state)\n return `rect_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n const trySelectRect = useCallback(\n (pageNum: number, pt: Point): { index: number | null; handle: ResizeHandle | null } => {\n // topmost rect wins (last in array)\n for (let i = rects.length - 1; i >= 0; i--) {\n const r = rects[i];\n if (r.page !== pageNum) continue;\n\n // handle hit first (for resize)\n const handle = hitTestHandle(pt, r, 6);\n if (handle) return { index: i, handle };\n\n if (hitTestRect(pt, r)) return { index: i, handle: null };\n }\n return { index: null, handle: null };\n },\n [rects]\n );\n\n const beginPointer = useCallback(\n (e: React.PointerEvent, page: DocumentPage) => {\n if (pointerIdRef.current !== null) return; // already tracking\n pointerIdRef.current = e.pointerId;\n\n const pt = clientToPagePoint(page, e.clientX, e.clientY);\n if (!pt) return;\n\n // If editing, attempt to select rect/handle first\n if (allowEdit) {\n const hit = trySelectRect(page.page, pt);\n if (hit.index !== null) {\n onRectSelect?.(rects[hit.index]);\n\n if (hit.handle) {\n const startRect = rects[hit.index];\n setDrag({ kind: \"resizing\", index: hit.index, page: page.page, handle: hit.handle, startPt: pt, startRect });\n } else {\n const startRect = rects[hit.index];\n setDrag({ kind: \"moving\", index: hit.index, page: page.page, startPt: pt, startRect });\n }\n\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n return;\n }\n }\n\n // Otherwise start creating selection\n if (!allowCreate) {\n onRectSelect?.(null)\n setDrag({ kind: \"none\" });\n return;\n }\n\n\n onRectSelect?.(null);\n\n const words = ocrByPage?.[page.page] ?? [];\n if (words.length > 0) {\n const wordIds: number[] = [];\n // seed selection if pointer down inside a word\n for (let i = 0; i < words.length; i++) {\n if (hitTestWord(pt, words[i])) {\n wordIds.push(i);\n break;\n }\n }\n setDrag({ kind: \"selecting\", page: page.page, startPt: pt, curPt: pt, wordIds });\n } else if (allowFreeformDragCreate) {\n setDrag({ kind: \"freeform\", page: page.page, startPt: pt, curPt: pt });\n } else {\n // no OCR and no freeform, nothing to do\n setDrag({ kind: \"none\" });\n }\n\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n },\n [allowCreate, allowEdit, allowFreeformDragCreate, clientToPagePoint, ocrByPage, rects, trySelectRect]\n );\n\n const movePointer = useCallback(\n (e: React.PointerEvent, page: DocumentPage) => {\n if (pointerIdRef.current !== e.pointerId) return;\n\n const pt = clientToPagePoint(page, e.clientX, e.clientY);\n if (!pt) return;\n\n setDrag((cur) => {\n if (cur.kind === \"selecting\" && cur.page === page.page) {\n const words = ocrByPage?.[page.page] ?? [];\n // collect words intersecting drag rect OR point hits\n const { x, y, w, h } = rectNormalize(cur.startPt.x, cur.startPt.y, pt.x, pt.y);\n\n const nextIds: number[] = [];\n for (let i = 0; i < words.length; i++) {\n const ww = words[i];\n const intersects =\n ww.x <= x + w &&\n ww.x + ww.w >= x &&\n ww.y <= y + h &&\n ww.y + ww.h >= y;\n if (intersects) nextIds.push(i);\n }\n return { ...cur, curPt: pt, wordIds: nextIds };\n }\n\n if (cur.kind === \"freeform\" && cur.page === page.page) {\n return { ...cur, curPt: pt };\n }\n\n if (cur.kind === \"moving\" && cur.page === page.page) {\n const dx = pt.x - cur.startPt.x;\n const dy = pt.y - cur.startPt.y;\n const nr: Rect = {\n ...cur.startRect,\n x: clamp(cur.startRect.x + dx, 0, page.width - cur.startRect.w),\n y: clamp(cur.startRect.y + dy, 0, page.height - cur.startRect.h),\n };\n const next = rects.slice();\n next[cur.index] = nr;\n commitRects(next);\n return cur;\n }\n\n if (cur.kind === \"resizing\" && cur.page === page.page) {\n const dx = pt.x - cur.startPt.x;\n const dy = pt.y - cur.startPt.y;\n\n const r0 = cur.startRect;\n let x = r0.x;\n let y = r0.y;\n let w = r0.w;\n let h = r0.h;\n\n const minSize = 4;\n\n const applyW = (delta: number) => {\n w = clamp(r0.w + delta, minSize, page.width);\n };\n const applyH = (delta: number) => {\n h = clamp(r0.h + delta, minSize, page.height);\n };\n const applyX = (delta: number) => {\n x = clamp(r0.x + delta, 0, page.width);\n };\n const applyY = (delta: number) => {\n y = clamp(r0.y + delta, 0, page.height);\n };\n\n // Resize logic by handle\n switch (cur.handle) {\n case \"e\":\n applyW(dx);\n break;\n case \"s\":\n applyH(dy);\n break;\n case \"se\":\n applyW(dx);\n applyH(dy);\n break;\n case \"w\": {\n const newX = clamp(r0.x + dx, 0, r0.x + r0.w - minSize);\n const newW = r0.x + r0.w - newX;\n x = newX;\n w = newW;\n break;\n }\n case \"n\": {\n const newY = clamp(r0.y + dy, 0, r0.y + r0.h - minSize);\n const newH = r0.y + r0.h - newY;\n y = newY;\n h = newH;\n break;\n }\n case \"nw\": {\n const newX = clamp(r0.x + dx, 0, r0.x + r0.w - minSize);\n const newY = clamp(r0.y + dy, 0, r0.y + r0.h - minSize);\n x = newX;\n y = newY;\n w = r0.x + r0.w - newX;\n h = r0.y + r0.h - newY;\n break;\n }\n case \"ne\": {\n const newY = clamp(r0.y + dy, 0, r0.y + r0.h - minSize);\n y = newY;\n h = r0.y + r0.h - newY;\n applyW(dx);\n break;\n }\n case \"sw\": {\n const newX = clamp(r0.x + dx, 0, r0.x + r0.w - minSize);\n x = newX;\n w = r0.x + r0.w - newX;\n applyH(dy);\n break;\n }\n }\n\n // clamp w/h so x+w, y+h stay in page\n w = clamp(w, minSize, page.width - x);\n h = clamp(h, minSize, page.height - y);\n\n const nr: Rect = { ...r0, x, y, w, h };\n const next = rects.slice();\n next[cur.index] = nr;\n commitRects(next);\n return cur;\n }\n\n return cur;\n });\n },\n [clientToPagePoint, commitRects, ocrByPage, rects, zoom]\n );\n\n const endPointer = useCallback(\n (e: React.PointerEvent, page: DocumentPage) => {\n if (pointerIdRef.current !== e.pointerId) return;\n pointerIdRef.current = null;\n\n setDrag((cur) => {\n if (cur.kind === \"selecting\" && cur.page === page.page) {\n const words = ocrByPage?.[page.page] ?? [];\n const selected = cur.wordIds.map((i) => words[i]).filter(Boolean);\n\n const u = unionBoxes(selected);\n if (u && u.w > 2 && u.h > 2) {\n const id = generateRectId();\n const next: Rect[] = rects.concat([\n { id, page: page.page, x: u.x, y: u.y, w: u.w, h: u.h, label: defaultRectLabel }\n ]);\n commitRects(next);\n onRectSelect?.(\n { id, page: page.page, x: u.x, y: u.y, w: u.w, h: u.h, label: defaultRectLabel }\n );\n }\n return { kind: \"none\" };\n }\n\n if (cur.kind === \"freeform\" && cur.page === page.page) {\n const r = rectNormalize(cur.startPt.x, cur.startPt.y, cur.curPt.x, cur.curPt.y);\n if (r.w > 2 && r.h > 2) {\n const id = generateRectId();\n const next: Rect[] = rects.concat([\n { id, page: page.page, x: r.x, y: r.y, w: r.w, h: r.h, label: defaultRectLabel }\n ]);\n commitRects(next);\n onRectSelect?.(\n { id, page: page.page, x: r.x, y: r.y, w: r.w, h: r.h, label: defaultRectLabel }\n );\n }\n return { kind: \"none\" };\n }\n\n if (cur.kind === \"moving\" || cur.kind === \"resizing\") {\n return { kind: \"none\" };\n }\n\n return { kind: \"none\" };\n });\n },\n [commitRects, defaultRectLabel, ocrByPage, rects]\n );\n\n const cancelPointer = useCallback(() => {\n pointerIdRef.current = null;\n setDrag({ kind: \"none\" });\n }, []);\n\n // Keyboard delete (library-friendly, optional)\n useEffect(() => {\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key !== \"Backspace\" && ev.key !== \"Delete\") return;\n if (!selectedId) return;\n\n const target = ev.target as HTMLElement | null;\n\n // 🚫 Do NOT delete if user is typing\n if (\n target &&\n (target.tagName === \"INPUT\" ||\n target.tagName === \"TEXTAREA\" ||\n target.isContentEditable)\n ) {\n return;\n }\n\n ev.preventDefault();\n commitRects(rects.filter(r => r.id !== selectedId));\n onRectSelect?.(null);\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [commitRects, rects, selectedId]);\n\n\n const selectionOverlay = useMemo(() => {\n if (drag.kind === \"selecting\") {\n const r = rectNormalize(drag.startPt.x, drag.startPt.y, drag.curPt.x, drag.curPt.y);\n return { page: drag.page, rect: r };\n }\n if (drag.kind === \"freeform\") {\n const r = rectNormalize(drag.startPt.x, drag.startPt.y, drag.curPt.x, drag.curPt.y);\n return { page: drag.page, rect: r };\n }\n return null;\n }, [drag]);\n\n const handleStyles: Record<ResizeHandle, React.CSSProperties> = useMemo(() => {\n const base: React.CSSProperties = {\n position: \"absolute\",\n width: 10,\n height: 10,\n background: \"#fff\",\n border: \"1px solid rgba(59,130,246,0.9)\",\n borderRadius: 2,\n boxShadow: \"0 0 0 2px rgba(59,130,246,0.25)\",\n };\n return {\n nw: { ...base, left: -5, top: -5, cursor: \"nwse-resize\" },\n n: { ...base, left: \"50%\", top: -5, transform: \"translateX(-50%)\", cursor: \"ns-resize\" },\n ne: { ...base, right: -5, top: -5, cursor: \"nesw-resize\" },\n e: { ...base, right: -5, top: \"50%\", transform: \"translateY(-50%)\", cursor: \"ew-resize\" },\n se: { ...base, right: -5, bottom: -5, cursor: \"nwse-resize\" },\n s: { ...base, left: \"50%\", bottom: -5, transform: \"translateX(-50%)\", cursor: \"ns-resize\" },\n sw: { ...base, left: -5, bottom: -5, cursor: \"nesw-resize\" },\n w: { ...base, left: -5, top: \"50%\", transform: \"translateY(-50%)\", cursor: \"ew-resize\" },\n };\n }, []);\n\n return (\n <div className={className} style={{ ...style, display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n {visiblePages.map((page) => {\n const pageRects = rects\n .filter(r => r.page === page.page);\n\n return (\n <div key={page.page} style={{ display: \"flex\", justifyContent: \"center\" }}>\n <div\n ref={(el) => setPageRef(page.page, el)}\n style={{\n position: \"relative\",\n width: page.width,\n height: page.height,\n transform: `scale(${zoom})`,\n transformOrigin: \"top left\",\n touchAction: \"none\",\n userSelect: \"none\",\n border: \"1px solid rgba(0,0,0,0.08)\",\n borderRadius: 8,\n overflow: \"hidden\",\n background: \"#f8f8f8\",\n }}\n onPointerDown={(e) => beginPointer(e, page)}\n onPointerMove={(e) => movePointer(e, page)}\n onPointerUp={(e) => endPointer(e, page)}\n onPointerCancel={cancelPointer}\n onPointerLeave={(e) => {\n // if pointer captured, we'll still get events. If not captured, be safe:\n if (pointerIdRef.current === null) return;\n }}\n onClick={(e) => {\n // click empty space clears selection\n const pt = clientToPagePoint(page, e.clientX, e.clientY);\n if (!pt) return;\n const hit = trySelectRect(page.page, pt);\n if (hit.index === null) onRectSelect?.(null);\n }}\n >\n {/* Background */}\n <img\n src={page.imageUrl}\n alt={`Page ${page.page}`}\n draggable={false}\n style={{\n width: page.width,\n display: \"block\",\n }}\n />\n\n {/* Selection overlay */}\n {selectionOverlay && selectionOverlay.page === page.page ? (\n <div\n style={{\n position: \"absolute\",\n left: selectionOverlay.rect.x ,\n top: selectionOverlay.rect.y ,\n width: selectionOverlay.rect.w ,\n height: selectionOverlay.rect.h ,\n background: \"rgba(59, 130, 246, 0.15)\",\n border: \"1px dashed rgba(59, 130, 246, 0.8)\",\n pointerEvents: \"none\",\n }}\n />\n ) : null}\n\n {/* Rect overlays */}\n {pageRects.map((r) => {\n const isSelected = selectedId === r.id;\n\n return (\n <div\n key={`${page.page}-${r.id}`}\n\n style={{\n position: \"absolute\",\n zIndex: isSelected ? 10 : 1,\n left: r.x,\n top: r.y,\n width: r.w,\n height: r.h,\n\n background: isSelected\n ? \"rgba(0,0,0,0.95)\"\n : isAnySelected\n ? \"rgba(0,0,0,0.55)\"\n : \"rgba(0,0,0,0.85)\",\n\n outline: \"none\",\n\n boxShadow: isSelected\n ? `\n 0 0 0 2px rgba(59,130,246,1),\n 0 0 0 6px rgba(59,130,246,0.25)\n `\n : \"0 0 0 1px rgba(255,255,255,0.15)\",\n\n cursor: allowEdit\n ? isSelected\n ? \"move\"\n : \"pointer\"\n : \"default\",\n\n transition: \"box-shadow 120ms ease, background 120ms ease\",\n }}\n\n onMouseDown={(ev) => {\n // prevent image drag ghost\n ev.preventDefault();\n }}\n onClick={(ev) => {\n ev.stopPropagation();\n onRectSelect?.(r);\n }}\n >\n {/* Label chip */}\n {r.label ? (\n <div\n style={{\n position: \"absolute\",\n left: \"50%\",\n top: \"50%\",\n transform: \"translate(-50%, -50%)\",\n\n maxWidth: \"90%\", // keep inside box\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n textTransform: \"uppercase\",\n\n background: \"rgba(255,255,255,0.9)\",\n color: \"#111\",\n fontSize: 8,\n padding: \"2px 4px\",\n borderRadius: 999,\n pointerEvents: \"none\",\n }}\n >\n {r.type ?? r.label}\n </div>\n ) : null}\n\n {/* Resize handles only when selected */}\n {allowEdit && isSelected ? (\n <>\n {(Object.keys(handleStyles) as ResizeHandle[]).map((h) => (\n <div key={h} style={handleStyles[h]} />\n ))}\n </>\n ) : null}\n </div>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport {\n X,\n FileText,\n Check,\n XIcon,\n Calendar,\n HardDrive,\n Building,\n ZoomIn,\n ZoomOut,\n File,\n} from 'lucide-react';\n\nimport { Rect } from './DocumentRedactionViewer';\nimport { PdfRedactionViewer } from './PdfRedactionViewer';\nimport { RedactionInspector } from './RedactionInspector';\nimport { PolicyRuleInput } from '../utils/policyRules';\n\n/* ============================================================================\n * Public Types\n * ========================================================================== */\n\nexport interface ViewerRedactionFlag {\n id: string;\n type: 'PII' | 'SSN' | 'Address' | 'Phone' | 'Face' | 'License Plate' | 'Custom';\n reason: string;\n approved: boolean;\n timestamp?: number; // for audio/video\n coordinates?: { x: number; y: number; width: number; height: number }; // for documents/images\n}\n\nexport enum ViewerIngestionMode {\n Default = 'default',\n Policy = 'policy',\n}\n\nexport type ViewerRedactionDecision = 'approved' | 'rejected';\n\nexport interface ViewerRedactionReview {\n reviewerId: string;\n reviewerEmail: string;\n decision: ViewerRedactionDecision;\n reviewedAt: string;\n comment?: string;\n}\n\nexport const RedactionReviewStatus = {\n Pending: 'pending',\n Approved: 'approved',\n Rejected: 'rejected',\n} as const;\n\nexport type RedactionReviewStatus =\n typeof RedactionReviewStatus[keyof typeof RedactionReviewStatus];\n\nexport interface ViewerFileRecord {\n id: string;\n name: string;\n size: number;\n type: string;\n uploadedAt: string;\n department: string;\n tags: string[];\n relevancyScore: number;\n\n // Step 2 (relevancy)\n reviewStatus: 'pending' | 'relevant' | 'irrelevant' | 'redacted';\n\n // Step 4 (redaction approval)\n redactionReviewStatus?: RedactionReviewStatus;\n redactionReviews?: ViewerRedactionReview[];\n\n redactionFlags: ViewerRedactionFlag[];\n caseIds: string[];\n pages?: number;\n duration?: number;\n ingestionMode?: ViewerIngestionMode;\n}\n\ninterface DocumentViewerProps {\n file: ViewerFileRecord;\n documentUrl: string;\n rects: Rect[];\n rules: PolicyRuleInput[];\n hideFileDetails: boolean;\n hideAICaseFindings: boolean;\n onRectsChange: (rects: Rect[]) => void;\n onDeleteRedactionBox: (boxId: string) => void;\n onClose: () => void;\n onFinalizeRedaction: () => void;\n onMarkRelevant?: (status: 'relevant' | 'irrelevant') => void;\n}\n\n/* ============================================================================\n * Helpers\n * ========================================================================== */\n\nconst isSupportedDocument = (type: string) =>\n type.includes('pdf') || type.includes('text') || type.includes('document');\n\n/* ============================================================================\n * Component\n * ========================================================================== */\n\nexport const FileViewer: React.FC<DocumentViewerProps> = ({\n file,\n documentUrl,\n rects,\n rules,\n hideFileDetails = true,\n hideAICaseFindings = true,\n onRectsChange,\n onClose,\n onFinalizeRedaction,\n onMarkRelevant,\n onDeleteRedactionBox,\n}) => {\n const [zoom, setZoom] = useState(100);\n const [, setSelectedBox] = useState<string | null>(null);\n\n const [selectedRect, setSelectedRect] = useState<Rect | null>(null);\n\n const unsupported = !isSupportedDocument(file.type);\n const [expandedPolicyKey, setExpandedPolicyKey] = useState<string | null>(null);\n\n const enforcedPolicies = React.useMemo(() => {\n const seen = new Set<string>();\n\n return rects\n .filter((r) => r.type && r.reason)\n .filter((r) => {\n const key = `${r.type}::${r.reason}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n })\n .map((r) => ({\n type: r.type!,\n reason: r.reason!,\n }));\n }, [rects]);\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n };\n\n const formatDuration = (seconds: number) => {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n if (hours > 0) {\n return `${hours}:${minutes.toString().padStart(2, '0')}:${secs\n .toString()\n .padStart(2, '0')}`;\n }\n return `${minutes}:${secs.toString().padStart(2, '0')}`;\n };\n\n const renderMetadataPanel = () => (\n <div className=\"bg-white rounded-lg border p-6\">\n <h4 className=\"font-semibold text-gray-900 mb-4\">File Details</h4>\n <div className=\"space-y-3 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">File Type</span>\n <span className=\"font-medium\">{file.type}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Size</span>\n <span className=\"font-medium\">{formatFileSize(file.size)}</span>\n </div>\n {file.pages && (\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Pages</span>\n <span className=\"font-medium\">{file.pages}</span>\n </div>\n )}\n {file.duration && (\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Duration</span>\n <span className=\"font-medium\">{formatDuration(file.duration)}</span>\n </div>\n )}\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Uploaded</span>\n <span className=\"font-medium\">\n {new Date(file.uploadedAt).toLocaleDateString()}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Department</span>\n <span className=\"font-medium\">{file.department}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Relevancy Score</span>\n <span className=\"font-semibold text-blue-600\">{file.relevancyScore}%</span>\n </div>\n </div>\n\n {file.tags.length > 0 && (\n <div className=\"mt-4\">\n <h5 className=\"font-medium text-gray-900 mb-2\">Detected Tags</h5>\n <div className=\"flex flex-wrap gap-2\">\n {file.tags.map((tag) => (\n <span\n key={tag}\n className=\"px-2 py-1 bg-gray-100 text-gray-700 text-xs rounded-full hover:bg-gray-200 cursor-pointer\"\n title=\"Click to highlight in document\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n\n const renderCaseFindings = () => (\n <div className=\"bg-blue-50 rounded-lg border border-blue-200 p-6\">\n <h4 className=\"font-semibold text-blue-900 mb-3\">AI Case Findings</h4>\n <p className=\"text-sm text-blue-800 leading-relaxed\">\n This document contains critical information related to the incident. Key entities\n identified include officer badge numbers, suspect information, and timeline details.\n Several areas require redaction before public release, including personal identifiers\n and sensitive location details.\n </p>\n\n {file.redactionFlags.length > 0 && (\n <div className=\"mt-4\">\n <h5 className=\"font-medium text-blue-900 mb-2\">Redaction Flags</h5>\n <div className=\"space-y-2\">\n {file.redactionFlags.map((flag) => (\n <div key={flag.id} className=\"flex items-center gap-2 text-sm\">\n <div className=\"w-2 h-2 bg-red-400 rounded-full\" />\n <span className=\"text-blue-800\">\n {flag.type}: {flag.reason}\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n\n return (\n <div className=\"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50\">\n {/* IMPORTANT: flex flex-col so header/footer stay fixed and middle can size correctly */}\n <div className=\"bg-white rounded-xl shadow-2xl w-full max-w-7xl max-h-[95vh] overflow-hidden flex flex-col\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-6 border-b border-gray-200\">\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2 bg-gray-100 rounded-lg\">\n <FileText className=\"w-6 h-6 text-gray-600\" />\n </div>\n <div>\n <h2 className=\"text-xl font-semibold text-gray-900\">{file.name}</h2>\n <div className=\"flex items-center gap-4 text-sm text-gray-500 mt-1\">\n {file.size !== undefined && (\n <span className=\"flex items-center gap-1\">\n <HardDrive className=\"w-4 h-4\" />\n {formatFileSize(file.size)}\n </span>\n )}\n {file.uploadedAt && (\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"w-4 h-4\" />\n {new Date(file.uploadedAt).toLocaleDateString()}\n </span>\n )}\n {file.department && (\n <span className=\"flex items-center gap-1\">\n <Building className=\"w-4 h-4\" />\n {file.department}\n </span>\n )}\n </div>\n </div>\n </div>\n\n <button onClick={onClose} className=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\">\n <X size={20} />\n </button>\n </div>\n\n {/* Content: no scroll here. children will scroll independently */}\n <div\n className=\"p-6 pb-0 overflow-hidden\"\n style={{ height: 'calc(95vh - 160px)' }} // header + footer accounted for\n >\n\n {unsupported ? (\n <div className=\"flex items-center justify-center h-full bg-gray-50 rounded-lg border\">\n <div className=\"text-center\">\n <File className=\"w-16 h-16 mx-auto mb-4 text-gray-400\" />\n <p className=\"text-lg font-medium text-gray-700\">This file type is not supported</p>\n <p className=\"text-sm text-gray-500 mt-1\">\n Only document and PDF files can be reviewed and redacted.\n </p>\n </div>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6 h-full min-h-0 grid-rows-[minmax(0,1fr)]\">\n {/* Document: scroll ONLY inside this panel */}\n <div className=\"lg:col-span-2 bg-gray-50 rounded-lg h-full\">\n <div className=\"h-full overflow-auto\">\n\n <PdfRedactionViewer\n pdfUrl={documentUrl}\n rects={rects}\n onRectsChange={onRectsChange}\n onRectSelect={(redactionBox) => setSelectedRect(redactionBox)}\n selectedRectId={selectedRect?.id ?? null}\n zoom={zoom / 100}\n allowCreate\n allowEdit\n allowFreeformDragCreate\n />\n </div>\n </div>\n\n {/* Sidebar: scroll ONLY inside sidebar */}\n <div className=\"h-full\">\n <div className=\"h-full overflow-y-auto pr-1 space-y-6\">\n\n {/* Zoom Controls */}\n <div className=\"bg-white rounded-lg border p-4\">\n <h4 className=\"font-semibold text-gray-900 mb-3\">View Controls</h4>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setZoom(Math.max(50, zoom - 5))}\n className=\"p-2 bg-gray-100 hover:bg-gray-200 rounded\"\n >\n <ZoomOut size={16} />\n </button>\n\n <input\n type=\"range\"\n min=\"50\"\n max=\"200\"\n step=\"5\"\n value={zoom}\n onChange={(e) => setZoom(Number(e.target.value))}\n className=\"flex-1\"\n />\n\n <button\n onClick={() => setZoom(Math.min(200, zoom + 5))}\n className=\"p-2 bg-gray-100 hover:bg-gray-200 rounded\"\n >\n <ZoomIn size={16} />\n </button>\n\n <span className=\"w-12 text-center text-sm\">{zoom}%</span>\n </div>\n <button\n onClick={() => setZoom(100)}\n className=\"mt-2 w-full px-3 py-1 bg-gray-100 hover:bg-gray-200 rounded text-sm text-gray-700\"\n >\n Reset Zoom\n </button>\n </div>\n\n {/* Redaction Box Properties */}\n <div className=\"bg-white rounded-lg border p-4\">\n <h4 className=\"font-semibold text-gray-900 mb-3\">Redaction Box Properties</h4>\n\n <RedactionInspector\n rect={selectedRect}\n rules={rules}\n onUpdate={(updated) => {\n onRectsChange(rects.map((r) => (r.id === updated.id ? updated : r)));\n }}\n onDelete={(id) => {\n onDeleteRedactionBox(id);\n setSelectedRect(null);\n setSelectedBox(null);\n }}\n />\n </div>\n\n {/* Enforced Policies */}\n <div className=\"bg-white rounded-lg border p-4\">\n <h4 className=\"font-semibold text-gray-900 mb-3\">Enforced Policies</h4>\n\n {enforcedPolicies.length === 0 ? (\n <p className=\"text-sm text-gray-500 leading-relaxed\">\n No policy-based redactions have been enforced yet.\n <br />\n <span className=\"text-xs text-gray-400\">\n This section will populate automatically when a redaction is created based on a policy rule.\n </span>\n </p>\n ) : (\n <div className=\"space-y-2\">\n {enforcedPolicies.map((p) => {\n const key = `${p.type}::${p.reason}`;\n const isExpanded = expandedPolicyKey === key;\n\n return (\n <div\n key={key}\n className=\"rounded border border-gray-200 bg-gray-50 px-3 py-2 cursor-pointer transition\"\n onClick={() => setExpandedPolicyKey(isExpanded ? null : key)}\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-gray-900\">{p.type}</span>\n <span className=\"text-[10px] text-blue-600\">\n {isExpanded ? 'Collapse' : 'Expand'}\n </span>\n </div>\n\n <div\n className={`mt-1 text-xs text-gray-600 leading-snug transition-all ${\n isExpanded\n ? 'max-h-[500px] whitespace-normal'\n : 'max-h-10 overflow-hidden text-ellipsis whitespace-nowrap'\n }`}\n >\n {p.reason}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {!hideFileDetails &&\n <>\n {renderMetadataPanel()}\n </>\n }\n\n {!hideAICaseFindings &&\n <>\n {renderCaseFindings()}\n </>\n }\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"flex items-center justify-between p-6 border-t border-gray-200\">\n <div className=\"text-sm text-gray-600\">\n Redaction\n </div>\n\n {onMarkRelevant && (\n <div className=\"flex items-center gap-3\">\n {/* <button\n onClick={() => onMarkRelevant('irrelevant')}\n className=\"flex items-center gap-2 px-6 py-2 bg-red-600 text-white rounded-lg hover:bg-red-700\"\n >\n <XIcon size={18} />\n Mark Irrelevant\n </button>\n <button\n onClick={() => onMarkRelevant('relevant')}\n className=\"flex items-center gap-2 px-6 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700\"\n >\n <Check size={18} />\n Mark Relevant\n </button> */}\n\n <button\n onClick={() => onFinalizeRedaction}\n className=\"flex items-center gap-2 px-6 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700\"\n >\n <Check size={18} />\n Finalize Redaction\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport * as pdfjs from \"pdfjs-dist\";\n\nimport {\n DocumentRedactionViewer,\n Rect,\n DocumentPage\n} from \"./DocumentRedactionViewer\";\n\n// Disable pdf.js worker completely (library-safe, no bundler assumptions)\npdfjs.GlobalWorkerOptions.workerSrc = \"\";\n\nexport type PdfRedactionViewerProps = {\n pdfUrl: string;\n rects: Rect[];\n onRectsChange: (r: Rect[]) => void;\n\n defaultRectLabel?: string;\n\n /** If true, user can draw/create new rects. */\n allowCreate?: boolean;\n\n /** If true, user can move/resize rects. */\n allowEdit?: boolean;\n\n /** Viewer scale. (1 = native page units) */\n zoom?: number;\n\n /** Styling hooks */\n className?: string;\n style?: React.CSSProperties;\n\n /** If provided, restrict selection to these pages. */\n pageFilter?: (page: DocumentPage) => boolean;\n\n /** Called when user selects a rect (optional). */\n onRectSelect?: (rect: Rect | null) => void;\n selectedRectId?: string | null;\n\n /**\n * If you want the selection behavior to create a rect even without OCR,\n * set this true (will create a freeform drag-rectangle).\n */\n allowFreeformDragCreate?: boolean;\n};\n\nexport const PdfRedactionViewer: React.FC<PdfRedactionViewerProps> = ({\n pdfUrl,\n rects,\n onRectsChange,\n onRectSelect,\n selectedRectId,\n defaultRectLabel,\n allowCreate,\n allowEdit,\n zoom,\n className,\n style,\n pageFilter,\n allowFreeformDragCreate\n}) => {\n const [pages, setPages] = useState<DocumentPage[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n async function loadPdf() {\n setLoading(true);\n setError(null);\n\n try {\n\n const loadingTask = pdfjs.getDocument({\n url: pdfUrl,\n withCredentials: false,\n disableWorker: true\n } as Parameters<typeof pdfjs.getDocument>[0] & {\n disableWorker: boolean;\n });\n\n const pdf = await loadingTask.promise;\n const nextPages: DocumentPage[] = [];\n\n for (let i = 1; i <= pdf.numPages; i++) {\n const page = await pdf.getPage(i);\n const viewport = page.getViewport({ scale: 2 });\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n throw new Error(\"Could not acquire 2D canvas context\");\n }\n\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n\n await page.render({\n canvas,\n viewport\n }).promise;\n\n nextPages.push({\n page: i,\n imageUrl: canvas.toDataURL(\"image/png\"),\n width: viewport.width,\n height: viewport.height\n });\n }\n\n if (!cancelled) {\n setPages(nextPages);\n setLoading(false);\n }\n } catch (err) {\n if (!cancelled) {\n setError(\"Failed to load or render PDF\");\n setLoading(false);\n }\n }\n }\n\n if (pdfUrl) {\n loadPdf();\n } else {\n setLoading(false);\n setError(\"No PDF URL provided\");\n }\n\n return () => {\n cancelled = true;\n };\n }, [pdfUrl]);\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-64 text-sm text-gray-500\">\n Loading PDF…\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-64 text-sm text-red-600\">\n {error}\n </div>\n );\n }\n\n return (\n <DocumentRedactionViewer\n pages={pages}\n rects={rects}\n onRectsChange={onRectsChange}\n selectedRectId={selectedRectId}\n allowCreate={allowCreate}\n defaultRectLabel={defaultRectLabel}\n allowEdit={allowEdit}\n zoom={zoom}\n className={className}\n style={style}\n pageFilter={pageFilter}\n allowFreeformDragCreate={allowFreeformDragCreate}\n onRectSelect={onRectSelect}\n />\n );\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Rect } from './DocumentRedactionViewer';\nimport { PolicyRuleInput } from '../utils/policyRules';\n\ninterface RedactionInspectorProps {\n rect: Rect | null;\n rules: PolicyRuleInput[];\n onUpdate: (next: Rect) => void;\n onDelete: (id: string) => void;\n}\n\nconst DEFAULT_REASON_BY_TYPE: Record<string, string> = {\n PII: 'Personally identifiable information',\n SSN: 'Social Security number',\n Address: 'Residential or mailing address',\n Phone: 'Phone number',\n Custom: '',\n};\n\nexport const RedactionInspector: React.FC<RedactionInspectorProps> = ({\n rect,\n rules,\n onUpdate,\n onDelete,\n}) => {\n const [query, setQuery] = useState('');\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n if (!rect) return;\n\n // Populate the input from the selected rect\n if (rect.type) {\n setQuery(rect.type);\n } else {\n setQuery('');\n }\n\n // Close the dropdown when switching boxes\n setOpen(false);\n }, [rect?.id]);\n\n\n const ruleOptions = useMemo(() => {\n return rules.map((r) => ({\n id: r.id,\n label: r.target,\n type: r.target,\n reason: r.source_text,\n }));\n }, [rules]);\n\n const filteredRules = useMemo(() => {\n const q = query.toLowerCase();\n return ruleOptions.filter((r) =>\n r.label.toLowerCase().includes(q)\n );\n }, [query, ruleOptions]);\n\n if (!rect) {\n return (\n <div className=\"text-sm text-gray-500\">\n Select a redaction box to edit its properties\n </div>\n );\n }\n\n const applyRule = (rule: {\n type: string;\n reason: string;\n }) => {\n const prevType = rect.type;\n const prevDefault =\n prevType ? DEFAULT_REASON_BY_TYPE[prevType] : undefined;\n\n const isAutoReason =\n !rect.reason || rect.reason === prevDefault;\n\n onUpdate({\n ...rect,\n type: rule.type,\n reason: isAutoReason ? rule.reason : rect.reason,\n });\n\n setQuery(rule.type);\n setOpen(false);\n };\n\n return (\n <div className=\"space-y-4\">\n {/* Rule Selector */}\n <div className=\"relative\">\n <label className=\"text-xs font-medium text-gray-600\">\n Policy Rule\n </label>\n\n <input\n className=\"mt-1 w-full border rounded px-2 py-1 text-sm\"\n placeholder=\"Search policy rules…\"\n value={query}\n onChange={(e) => {\n setQuery(e.target.value);\n setOpen(true);\n }}\n onFocus={() => setOpen(true)}\n />\n\n {open && (\n <div className=\"absolute z-10 mt-1 w-full max-h-48 overflow-auto rounded border bg-white shadow\">\n {filteredRules.length === 0 ? (\n <div className=\"px-3 py-2 text-xs text-gray-500\">\n No matching rules\n </div>\n ) : (\n filteredRules.map((rule) => (\n <div\n key={rule.id}\n className=\"px-3 py-2 text-sm cursor-pointer hover:bg-gray-100\"\n onMouseDown={() => applyRule(rule)}\n >\n {rule.label}\n </div>\n ))\n )}\n\n {/* Explicit Custom option */}\n <div\n className=\"px-3 py-2 text-sm cursor-pointer border-t hover:bg-gray-100\"\n onMouseDown={() =>\n applyRule({\n type: 'Custom',\n reason: '',\n })\n }\n >\n Custom\n </div>\n </div>\n )}\n </div>\n\n {/* Reason */}\n <div>\n <label className=\"text-xs font-medium text-gray-600\">\n Reason\n </label>\n <textarea\n className=\"mt-1 w-full border rounded px-2 py-1 text-sm\"\n rows={3}\n value={rect.reason ?? ''}\n onChange={(e) =>\n onUpdate({ ...rect, reason: e.target.value })\n }\n />\n </div>\n\n {/* Delete */}\n <button\n className=\"w-full bg-red-600 text-white text-sm py-1.5 rounded\"\n onClick={() => onDelete(rect.id)}\n >\n Delete Redaction\n </button>\n </div>\n );\n};\n"],"mappings":"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","names":["import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","ViewerIngestionMode","React"]}
|