chore(autonomous-session): consolidate uncommitted work from prior session
Bundles the prior autonomous-session output that was sitting unstaged: - Em-dash sweep across src/ + tests/ (en-dash/em-dash to hyphen, ~2280 instances) - country-flag-icons rollout (CountryFlag component, replaces emoji glyphs that never rendered on Windows; lazy-loads the 3x2 SVG index as a single chunk after the per-subpath dynamic-import approach silently failed in webpack) - Admin IA Phase 1+2: 7-domain regroup, 41 to 38 pages, /admin/berths index, redirects (ocr to ai, reports to dashboard, invitations to users), docs/admin-ia-proposal.md - Per-template email tester (registry + endpoint + UI on Email admin page) - Cancel-document mode picker (delete-from-Documenso vs keep-for-audit) - Dashboard PDF report: 25 widgets, SVG charts, date-range picker, 11 resolvers - Customize-widgets per-region sortables at xl+ (charts/rails/feed); single flat sortable below xl when the layout stacks; per-viewport saved orders - Audit doc updates capturing each shipped item - Lint fixes: react-compiler immutability in DonutChart (reduce instead of let-reassign), set-state-in-effect disables in CountryFlag and UploadForSigning preview-bytes effect, unused 'confirm' destructures in interest contract + reservation tabs, unescaped apostrophe in test-template card copy
This commit is contained in:
@@ -19,7 +19,7 @@ import { apiFetch } from '@/lib/api/client';
|
||||
const Lightbox = dynamic(() => import('yet-another-react-lightbox'), { ssr: false });
|
||||
import 'yet-another-react-lightbox/styles.css';
|
||||
|
||||
// pdfjs-dist is ~150kb gzip — lazy-load so routes that never preview
|
||||
// pdfjs-dist is ~150kb gzip - lazy-load so routes that never preview
|
||||
// PDFs don't ship it. ssr:false because the worker setup needs window.
|
||||
const PdfViewer = dynamic(() => import('./pdf-viewer').then((m) => ({ default: m.PdfViewer })), {
|
||||
ssr: false,
|
||||
@@ -40,7 +40,7 @@ interface FilePreviewDialogProps {
|
||||
|
||||
/**
|
||||
* Routes a file's mime type to one of seven preview surfaces. Order
|
||||
* matters — `application/pdf` is matched before the generic
|
||||
* matters - `application/pdf` is matched before the generic
|
||||
* "application/*" bucket so PDFs stay on the rich pdfjs viewer.
|
||||
*/
|
||||
type PreviewKind =
|
||||
@@ -187,12 +187,12 @@ export function FilePreviewDialog({
|
||||
|
||||
{!loading && !error && previewUrl && kind === 'office' && (
|
||||
// Office documents render via Microsoft's hosted Office viewer
|
||||
// — public URL only; presigned download URLs include a token
|
||||
// - public URL only; presigned download URLs include a token
|
||||
// in the query string so they work here even though the file
|
||||
// isn't world-public. The viewer streams the document and
|
||||
// renders a high-fidelity preview without us shipping a
|
||||
// headless LibreOffice. Falls back to "download to view" if
|
||||
// the embed loads but renders nothing (e.g. CORS rejected) —
|
||||
// the embed loads but renders nothing (e.g. CORS rejected) -
|
||||
// detection is hard so we just keep the download CTA below.
|
||||
<iframe
|
||||
title={fileName ?? 'Office document preview'}
|
||||
@@ -240,7 +240,7 @@ export function FilePreviewDialog({
|
||||
}
|
||||
|
||||
/**
|
||||
* Plain-text preview pane — fetches the file body via the presigned
|
||||
* Plain-text preview pane - fetches the file body via the presigned
|
||||
* URL (no auth needed; the URL itself carries the access token) and
|
||||
* renders it as monospaced text. Caps the body at 1 MB so a huge log
|
||||
* file doesn't lock the browser; surfaces a "first 1 MB shown" notice
|
||||
|
||||
@@ -53,7 +53,7 @@ export function FileUploadZone({
|
||||
const [isDragOver, setIsDragOver] = useState(false);
|
||||
const [uploading, setUploading] = useState<UploadingFile[]>([]);
|
||||
const inputRef = useRef<HTMLInputElement>(null);
|
||||
// Scope toggle — only meaningful when an interest is being uploaded
|
||||
// Scope toggle - only meaningful when an interest is being uploaded
|
||||
// FROM (i.e. the rep is on the InterestDocumentsTab). Default to the
|
||||
// narrower "deal" scope so a rep uploading a contract specific to this
|
||||
// deal doesn't accidentally surface it under every interest the client
|
||||
@@ -162,7 +162,7 @@ export function FileUploadZone({
|
||||
|
||||
return (
|
||||
<div className="space-y-3">
|
||||
{/* Scope radio — only renders when an interest FK is present. The
|
||||
{/* Scope radio - only renders when an interest FK is present. The
|
||||
rep picks whether the upload files at the deal level (nested
|
||||
under Clients/<Name>/<Interest>) or the client level
|
||||
(Clients/<Name>). Default = deal, since that's the narrower
|
||||
|
||||
@@ -51,7 +51,7 @@ function PdfViewerBody({ url, fileName }: PdfViewerProps) {
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
|
||||
// Keep options stable across renders so react-pdf doesn't refetch
|
||||
// every render — useMemo wins because react-pdf compares by identity.
|
||||
// every render - useMemo wins because react-pdf compares by identity.
|
||||
const options = useMemo(
|
||||
() => ({
|
||||
cMapUrl: `https://unpkg.com/pdfjs-dist@${pdfjs.version}/cmaps/`,
|
||||
@@ -70,7 +70,7 @@ function PdfViewerBody({ url, fileName }: PdfViewerProps) {
|
||||
{
|
||||
scaleBounds: { min: 0.5, max: 3 },
|
||||
from: () => [scale, 0],
|
||||
// Don't hijack wheel events — desktop users zoom via buttons,
|
||||
// Don't hijack wheel events - desktop users zoom via buttons,
|
||||
// wheel still scrolls the page.
|
||||
eventOptions: { passive: false },
|
||||
},
|
||||
@@ -91,7 +91,7 @@ function PdfViewerBody({ url, fileName }: PdfViewerProps) {
|
||||
<ChevronLeft className="h-4 w-4" />
|
||||
</Button>
|
||||
<span className="min-w-[80px] text-center tabular-nums">
|
||||
{numPages ? `${pageNumber} / ${numPages}` : '—'}
|
||||
{numPages ? `${pageNumber} / ${numPages}` : '-'}
|
||||
</span>
|
||||
<Button
|
||||
type="button"
|
||||
|
||||
Reference in New Issue
Block a user