@cannymindstech/file-viewers 0.27.8 → 0.27.10
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-CGI7WNEQ.js → chunk-7P6WEBHN.js} +8 -4
- package/dist/chunk-7P6WEBHN.js.map +1 -0
- package/dist/{chunk-QGL3ZOPD.mjs → chunk-EI3EP65I.mjs} +177 -51
- package/dist/chunk-EI3EP65I.mjs.map +1 -0
- package/dist/{chunk-MJYCPSD4.js → chunk-MPTCXAXO.js} +179 -53
- package/dist/chunk-MPTCXAXO.js.map +1 -0
- package/dist/{chunk-6EOXXNHL.mjs → chunk-PZGUVU6N.mjs} +8 -4
- package/dist/chunk-PZGUVU6N.mjs.map +1 -0
- package/dist/components/viewers/AudioViewer.d.mts +1 -1
- package/dist/components/viewers/AudioViewer.d.ts +1 -1
- package/dist/components/viewers/DefaultViewer.d.mts +1 -1
- package/dist/components/viewers/DefaultViewer.d.ts +1 -1
- package/dist/components/viewers/ImageViewer.d.mts +1 -1
- package/dist/components/viewers/ImageViewer.d.ts +1 -1
- package/dist/components/viewers/PDFViewer.d.mts +1 -1
- package/dist/components/viewers/PDFViewer.d.ts +1 -1
- package/dist/components/viewers/PDFViewer.js +2 -2
- package/dist/components/viewers/PDFViewer.mjs +1 -1
- package/dist/components/viewers/TIFFViewer.d.mts +1 -1
- package/dist/components/viewers/TIFFViewer.d.ts +1 -1
- package/dist/components/viewers/TIFFViewer.js +2 -2
- package/dist/components/viewers/TIFFViewer.mjs +1 -1
- package/dist/components/viewers/TextViewer.d.mts +1 -1
- package/dist/components/viewers/TextViewer.d.ts +1 -1
- package/dist/components/viewers/VideoViewer.d.mts +1 -1
- package/dist/components/viewers/VideoViewer.d.ts +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/index.mjs +2 -2
- package/dist/{types-BWcgxRje.d.mts → types-BYTxtKEc.d.mts} +1 -0
- package/dist/{types-BWcgxRje.d.ts → types-BYTxtKEc.d.ts} +1 -0
- package/package.json +4 -3
- package/dist/chunk-6EOXXNHL.mjs.map +0 -1
- package/dist/chunk-CGI7WNEQ.js.map +0 -1
- package/dist/chunk-MJYCPSD4.js.map +0 -1
- package/dist/chunk-QGL3ZOPD.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } 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";
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } 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
2
|
|
|
3
3
|
|
|
4
4
|
var _chunkOPJOCUSLjs = require('./chunk-OPJOCUSL.js');
|
|
@@ -41,6 +41,7 @@ var _Info = require('@mui/icons-material/Info'); var _Info2 = _interopRequireDef
|
|
|
41
41
|
var _Description = require('@mui/icons-material/Description'); var _Description2 = _interopRequireDefault(_Description);
|
|
42
42
|
var _History = require('@mui/icons-material/History'); var _History2 = _interopRequireDefault(_History);
|
|
43
43
|
var _iconsmaterial = require('@mui/icons-material');
|
|
44
|
+
var _utif = require('utif'); var UTIF = _interopRequireWildcard(_utif);
|
|
44
45
|
var _jsxruntime = require('react/jsx-runtime');
|
|
45
46
|
var resolveDocumentName = (file, fileName, url) => {
|
|
46
47
|
if (_optionalChain([file, 'optionalAccess', _ => _.name])) {
|
|
@@ -94,6 +95,40 @@ var TIFFViewerContent = ({
|
|
|
94
95
|
autoExecuteSearch,
|
|
95
96
|
onSearchComplete,
|
|
96
97
|
toolbarActions,
|
|
98
|
+
// Annotation-related FileViewerProps (PDF only) — extract so they don't
|
|
99
|
+
// leak onto the DOM via {...props} on <Box>.
|
|
100
|
+
showAnnotations,
|
|
101
|
+
userDetails,
|
|
102
|
+
annotationSelectionMenu,
|
|
103
|
+
isHighlighterActive,
|
|
104
|
+
isStampActive,
|
|
105
|
+
isNoteActive,
|
|
106
|
+
onHighlighterClick,
|
|
107
|
+
onStampClick,
|
|
108
|
+
onSignatureClick,
|
|
109
|
+
onNoteClick,
|
|
110
|
+
permissions,
|
|
111
|
+
isAnnotationForeign,
|
|
112
|
+
onAnnotationNoteClick,
|
|
113
|
+
isAnnotationInteractive,
|
|
114
|
+
hasUnsavedAnnotations,
|
|
115
|
+
isSavingAnnotations,
|
|
116
|
+
canSaveAnnotations,
|
|
117
|
+
onSaveAnnotations,
|
|
118
|
+
onDownloadWithAnnotations,
|
|
119
|
+
onDownloadWithoutAnnotations,
|
|
120
|
+
onPrintWithAnnotations,
|
|
121
|
+
onPrintWithoutAnnotations,
|
|
122
|
+
showDownloadOriginal,
|
|
123
|
+
showDownloadWithAnnotations,
|
|
124
|
+
showPrintOriginal,
|
|
125
|
+
showPrintWithAnnotations,
|
|
126
|
+
showAnnotate,
|
|
127
|
+
disabledAnnotate,
|
|
128
|
+
showRotation,
|
|
129
|
+
defaultFitToPage,
|
|
130
|
+
loading,
|
|
131
|
+
onPasswordRequest,
|
|
97
132
|
...props
|
|
98
133
|
}) => {
|
|
99
134
|
const [currentPage, setCurrentPage] = _react.useState.call(void 0, 1);
|
|
@@ -105,7 +140,7 @@ var TIFFViewerContent = ({
|
|
|
105
140
|
const [zoom, setZoom] = _react.useState.call(void 0, 100);
|
|
106
141
|
const [viewportWidth, setViewportWidth] = _react.useState.call(void 0, 0);
|
|
107
142
|
const [viewportHeight, setViewportHeight] = _react.useState.call(void 0, 0);
|
|
108
|
-
const [
|
|
143
|
+
const [, setIsFullScreen] = _react.useState.call(void 0, false);
|
|
109
144
|
const [imageUrl, setImageUrl] = _react.useState.call(void 0, null);
|
|
110
145
|
const [pageImages, setPageImages] = _react.useState.call(void 0, /* @__PURE__ */ new Map());
|
|
111
146
|
const [internalLoading, setInternalLoading] = _react.useState.call(void 0, false);
|
|
@@ -117,6 +152,9 @@ var TIFFViewerContent = ({
|
|
|
117
152
|
_react.useEffect.call(void 0, () => {
|
|
118
153
|
pageLoaderRef.current = pageLoader;
|
|
119
154
|
}, [pageLoader]);
|
|
155
|
+
const [localTotalPages, setLocalTotalPages] = _react.useState.call(void 0, 0);
|
|
156
|
+
const tiffSourceRef = _react.useRef.call(void 0, null);
|
|
157
|
+
const effectiveTotalPages = localTotalPages || totalPages;
|
|
120
158
|
const updatePageImage = _react.useCallback.call(void 0,
|
|
121
159
|
(pageData, pageNumber) => {
|
|
122
160
|
const blob = new Blob([pageData]);
|
|
@@ -133,6 +171,39 @@ var TIFFViewerContent = ({
|
|
|
133
171
|
},
|
|
134
172
|
[]
|
|
135
173
|
);
|
|
174
|
+
const decodeLocalPage = _react.useCallback.call(void 0,
|
|
175
|
+
async (pageIndex) => {
|
|
176
|
+
const source = tiffSourceRef.current;
|
|
177
|
+
if (!source) return null;
|
|
178
|
+
const image = source.ifds[pageIndex];
|
|
179
|
+
if (!image) return null;
|
|
180
|
+
UTIF.decodeImage(source.buffer, image);
|
|
181
|
+
const rgba = UTIF.toRGBA8(image);
|
|
182
|
+
const width2 = Number(image.width) || 0;
|
|
183
|
+
const height2 = Number(image.height) || 0;
|
|
184
|
+
if (!width2 || !height2) return null;
|
|
185
|
+
const canvas = document.createElement("canvas");
|
|
186
|
+
canvas.width = width2;
|
|
187
|
+
canvas.height = height2;
|
|
188
|
+
const ctx = canvas.getContext("2d");
|
|
189
|
+
if (!ctx) return null;
|
|
190
|
+
ctx.putImageData(
|
|
191
|
+
new ImageData(new Uint8ClampedArray(rgba), width2, height2),
|
|
192
|
+
0,
|
|
193
|
+
0
|
|
194
|
+
);
|
|
195
|
+
return await new Promise((resolve) => {
|
|
196
|
+
canvas.toBlob(async (blob) => {
|
|
197
|
+
if (!blob) {
|
|
198
|
+
resolve(null);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
resolve(await blob.arrayBuffer());
|
|
202
|
+
}, "image/png");
|
|
203
|
+
});
|
|
204
|
+
},
|
|
205
|
+
[]
|
|
206
|
+
);
|
|
136
207
|
_react.useEffect.call(void 0, () => {
|
|
137
208
|
const loadInitialPage = async () => {
|
|
138
209
|
if (pageLoaderRef.current && !pageImages.has(1) && currentPage === 1) {
|
|
@@ -156,9 +227,66 @@ var TIFFViewerContent = ({
|
|
|
156
227
|
};
|
|
157
228
|
loadInitialPage();
|
|
158
229
|
}, [pageImages, currentPage, updatePageImage, onError]);
|
|
230
|
+
_react.useEffect.call(void 0, () => {
|
|
231
|
+
if (!file && !url) {
|
|
232
|
+
tiffSourceRef.current = null;
|
|
233
|
+
setLocalTotalPages(0);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
let cancelled = false;
|
|
237
|
+
(async () => {
|
|
238
|
+
try {
|
|
239
|
+
let buffer = null;
|
|
240
|
+
if (file) {
|
|
241
|
+
buffer = await file.arrayBuffer();
|
|
242
|
+
} else if (url && !pageLoader) {
|
|
243
|
+
buffer = await (await fetch(url)).arrayBuffer();
|
|
244
|
+
}
|
|
245
|
+
if (cancelled || !buffer) return;
|
|
246
|
+
const ifds = UTIF.decode(buffer);
|
|
247
|
+
if (!ifds.length) {
|
|
248
|
+
throw new Error("No pages found in TIFF");
|
|
249
|
+
}
|
|
250
|
+
tiffSourceRef.current = { buffer, ifds };
|
|
251
|
+
setLocalTotalPages(ifds.length);
|
|
252
|
+
if (pageLoader) return;
|
|
253
|
+
setInternalLoading(true);
|
|
254
|
+
setError(null);
|
|
255
|
+
setImageUrl(null);
|
|
256
|
+
setImageSize(null);
|
|
257
|
+
setPageImages((prev) => {
|
|
258
|
+
prev.forEach((u) => URL.revokeObjectURL(u));
|
|
259
|
+
return /* @__PURE__ */ new Map();
|
|
260
|
+
});
|
|
261
|
+
const firstPage = await decodeLocalPage(0);
|
|
262
|
+
if (cancelled) return;
|
|
263
|
+
if (!firstPage) {
|
|
264
|
+
throw new Error("Failed to decode TIFF page 1");
|
|
265
|
+
}
|
|
266
|
+
updatePageImage(firstPage, 1);
|
|
267
|
+
_optionalChain([onLoad, 'optionalCall', _11 => _11()]);
|
|
268
|
+
} catch (err) {
|
|
269
|
+
if (cancelled) return;
|
|
270
|
+
const message = err instanceof Error ? err.message : "Failed to decode TIFF";
|
|
271
|
+
if (!pageLoader) {
|
|
272
|
+
setError(message);
|
|
273
|
+
_optionalChain([onError, 'optionalCall', _12 => _12(new Error(message))]);
|
|
274
|
+
} else {
|
|
275
|
+
console.warn(`[TIFFViewer] Local IFD count failed: ${message}`);
|
|
276
|
+
}
|
|
277
|
+
} finally {
|
|
278
|
+
if (!cancelled && !pageLoader) setInternalLoading(false);
|
|
279
|
+
}
|
|
280
|
+
})();
|
|
281
|
+
return () => {
|
|
282
|
+
cancelled = true;
|
|
283
|
+
};
|
|
284
|
+
}, [file, url, pageLoader, decodeLocalPage, updatePageImage, onLoad, onError]);
|
|
159
285
|
const handlePageChange = _react.useCallback.call(void 0,
|
|
160
286
|
async (newPageNumber) => {
|
|
161
|
-
|
|
287
|
+
const hasExternalLoader = !!pageLoaderRef.current;
|
|
288
|
+
const hasLocalSource = !!tiffSourceRef.current;
|
|
289
|
+
if (!hasExternalLoader && !hasLocalSource) {
|
|
162
290
|
console.warn("pageLoader not provided - page navigation disabled");
|
|
163
291
|
return;
|
|
164
292
|
}
|
|
@@ -168,10 +296,9 @@ var TIFFViewerContent = ({
|
|
|
168
296
|
setImageUrl(cachedUrl);
|
|
169
297
|
return;
|
|
170
298
|
}
|
|
171
|
-
setInternalLoading(true);
|
|
172
299
|
setError(null);
|
|
173
300
|
try {
|
|
174
|
-
const pageData = await pageLoaderRef.current(newPageNumber);
|
|
301
|
+
const pageData = hasExternalLoader ? await pageLoaderRef.current(newPageNumber) : await decodeLocalPage(newPageNumber - 1);
|
|
175
302
|
if (pageData) {
|
|
176
303
|
updatePageImage(pageData, newPageNumber);
|
|
177
304
|
} else {
|
|
@@ -180,12 +307,10 @@ var TIFFViewerContent = ({
|
|
|
180
307
|
} catch (err) {
|
|
181
308
|
const message = err instanceof Error ? err.message : `Unable to load page ${newPageNumber}`;
|
|
182
309
|
setError(message);
|
|
183
|
-
_optionalChain([onError, 'optionalCall',
|
|
184
|
-
} finally {
|
|
185
|
-
setInternalLoading(false);
|
|
310
|
+
_optionalChain([onError, 'optionalCall', _13 => _13(new Error(message))]);
|
|
186
311
|
}
|
|
187
312
|
},
|
|
188
|
-
[pageImages, onError, updatePageImage]
|
|
313
|
+
[pageImages, onError, updatePageImage, decodeLocalPage]
|
|
189
314
|
);
|
|
190
315
|
const resolvedFileName = _react.useMemo.call(void 0,
|
|
191
316
|
() => fileName || sourceDescription,
|
|
@@ -205,37 +330,14 @@ var TIFFViewerContent = ({
|
|
|
205
330
|
}
|
|
206
331
|
setIsLoading(true);
|
|
207
332
|
setError(null);
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
} else if (url) {
|
|
213
|
-
imageDataUrl = url;
|
|
214
|
-
} else {
|
|
215
|
-
throw new Error("No file or URL provided");
|
|
216
|
-
}
|
|
217
|
-
setImageUrl(imageDataUrl);
|
|
218
|
-
if (resetPage) {
|
|
219
|
-
setCurrentPage(1);
|
|
220
|
-
setFitMode("fit-page");
|
|
221
|
-
setZoom(100);
|
|
222
|
-
}
|
|
223
|
-
_optionalChain([onLoad, 'optionalCall', _12 => _12()]);
|
|
224
|
-
} catch (err) {
|
|
225
|
-
const message = err instanceof Error ? err.message : "Unable to load image file";
|
|
226
|
-
setError(message);
|
|
227
|
-
setImageUrl(null);
|
|
228
|
-
if (resetPage) {
|
|
229
|
-
setCurrentPage(1);
|
|
230
|
-
setFitMode("fit-width");
|
|
231
|
-
setZoom(100);
|
|
232
|
-
}
|
|
233
|
-
_optionalChain([onError, 'optionalCall', _13 => _13(new Error(message))]);
|
|
234
|
-
} finally {
|
|
235
|
-
setIsLoading(false);
|
|
333
|
+
if (resetPage) {
|
|
334
|
+
setCurrentPage(1);
|
|
335
|
+
setFitMode("fit-page");
|
|
336
|
+
setZoom(100);
|
|
236
337
|
}
|
|
338
|
+
setIsLoading(false);
|
|
237
339
|
},
|
|
238
|
-
[file, url
|
|
340
|
+
[file, url]
|
|
239
341
|
);
|
|
240
342
|
const [previousFileSource, setPreviousFileSource] = _react.useState.call(void 0, {});
|
|
241
343
|
_react.useEffect.call(void 0, () => {
|
|
@@ -259,7 +361,7 @@ var TIFFViewerContent = ({
|
|
|
259
361
|
};
|
|
260
362
|
}, []);
|
|
261
363
|
const hasImage = !!imageUrl;
|
|
262
|
-
const hasMultiplePages =
|
|
364
|
+
const hasMultiplePages = effectiveTotalPages > 1;
|
|
263
365
|
const MARGIN = 40;
|
|
264
366
|
const MIN_ZOOM = 25;
|
|
265
367
|
const MAX_ZOOM = 400;
|
|
@@ -345,8 +447,8 @@ var TIFFViewerContent = ({
|
|
|
345
447
|
handlePageChange(1);
|
|
346
448
|
}, [handlePageChange]);
|
|
347
449
|
const handleLastPage = _react.useCallback.call(void 0, () => {
|
|
348
|
-
handlePageChange(
|
|
349
|
-
}, [handlePageChange,
|
|
450
|
+
handlePageChange(effectiveTotalPages);
|
|
451
|
+
}, [handlePageChange, effectiveTotalPages]);
|
|
350
452
|
const handlePreviousPage = _react.useCallback.call(void 0, () => {
|
|
351
453
|
const newPage = Math.max(currentPage - 1, 1);
|
|
352
454
|
if (newPage !== currentPage) {
|
|
@@ -354,20 +456,44 @@ var TIFFViewerContent = ({
|
|
|
354
456
|
}
|
|
355
457
|
}, [currentPage, handlePageChange]);
|
|
356
458
|
const handleNextPage = _react.useCallback.call(void 0, () => {
|
|
357
|
-
const newPage = Math.min(currentPage + 1,
|
|
459
|
+
const newPage = Math.min(currentPage + 1, effectiveTotalPages);
|
|
358
460
|
if (newPage !== currentPage) {
|
|
359
461
|
handlePageChange(newPage);
|
|
360
462
|
}
|
|
361
|
-
}, [currentPage,
|
|
463
|
+
}, [currentPage, effectiveTotalPages, handlePageChange]);
|
|
362
464
|
const handleToggleFullScreen = _react.useCallback.call(void 0, () => {
|
|
363
|
-
if (!
|
|
465
|
+
if (!document.fullscreenElement && _optionalChain([containerRef, 'access', _17 => _17.current, 'optionalAccess', _18 => _18.requestFullscreen])) {
|
|
364
466
|
containerRef.current.requestFullscreen();
|
|
365
|
-
|
|
366
|
-
} else if (isFullScreen && document.exitFullscreen) {
|
|
467
|
+
} else if (document.fullscreenElement && document.exitFullscreen) {
|
|
367
468
|
document.exitFullscreen();
|
|
368
|
-
setIsFullScreen(false);
|
|
369
469
|
}
|
|
370
|
-
}, [
|
|
470
|
+
}, []);
|
|
471
|
+
_react.useEffect.call(void 0, () => {
|
|
472
|
+
const onFullscreenChange = () => {
|
|
473
|
+
setIsFullScreen(!!document.fullscreenElement);
|
|
474
|
+
};
|
|
475
|
+
document.addEventListener("fullscreenchange", onFullscreenChange);
|
|
476
|
+
return () => {
|
|
477
|
+
document.removeEventListener("fullscreenchange", onFullscreenChange);
|
|
478
|
+
};
|
|
479
|
+
}, []);
|
|
480
|
+
const handlePrint = _react.useCallback.call(void 0, () => {
|
|
481
|
+
if (!imageUrl) return;
|
|
482
|
+
const printWindow = window.open("", "_blank", "width=900,height=1200");
|
|
483
|
+
if (!printWindow) return;
|
|
484
|
+
const doc = printWindow.document;
|
|
485
|
+
doc.title = resolvedFileName || "Document";
|
|
486
|
+
const style2 = doc.createElement("style");
|
|
487
|
+
style2.textContent = "@page { margin: 0.5cm; }html, body { margin: 0; padding: 0; }img { display: block; width: 100%; height: auto; page-break-after: always; }";
|
|
488
|
+
doc.head.appendChild(style2);
|
|
489
|
+
const img = doc.createElement("img");
|
|
490
|
+
img.alt = resolvedFileName || "Document";
|
|
491
|
+
img.onload = () => {
|
|
492
|
+
window.setTimeout(() => printWindow.print(), 100);
|
|
493
|
+
};
|
|
494
|
+
img.src = imageUrl;
|
|
495
|
+
doc.body.appendChild(img);
|
|
496
|
+
}, [imageUrl, resolvedFileName]);
|
|
371
497
|
const toolbar = _chunkEM63H4SAjs.mergeToolbarConfig.call(void 0, {
|
|
372
498
|
showDownload,
|
|
373
499
|
showPrint,
|
|
@@ -511,7 +637,7 @@ var TIFFViewerContent = ({
|
|
|
511
637
|
"Page ",
|
|
512
638
|
currentPage,
|
|
513
639
|
" of ",
|
|
514
|
-
|
|
640
|
+
effectiveTotalPages
|
|
515
641
|
]
|
|
516
642
|
}
|
|
517
643
|
),
|
|
@@ -520,7 +646,7 @@ var TIFFViewerContent = ({
|
|
|
520
646
|
{
|
|
521
647
|
size: "small",
|
|
522
648
|
onClick: handleNextPage,
|
|
523
|
-
disabled: currentPage ===
|
|
649
|
+
disabled: currentPage === effectiveTotalPages,
|
|
524
650
|
title: "Next Page",
|
|
525
651
|
"aria-label": "Go to next page",
|
|
526
652
|
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _ChevronRight2.default, { fontSize: "small" })
|
|
@@ -531,7 +657,7 @@ var TIFFViewerContent = ({
|
|
|
531
657
|
{
|
|
532
658
|
size: "small",
|
|
533
659
|
onClick: handleLastPage,
|
|
534
|
-
disabled: currentPage ===
|
|
660
|
+
disabled: currentPage === effectiveTotalPages,
|
|
535
661
|
title: "Last Page",
|
|
536
662
|
"aria-label": "Go to last page",
|
|
537
663
|
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _LastPage2.default, { fontSize: "small" })
|
|
@@ -610,7 +736,7 @@ var TIFFViewerContent = ({
|
|
|
610
736
|
_material.IconButton,
|
|
611
737
|
{
|
|
612
738
|
size: "small",
|
|
613
|
-
onClick: toolbar.getHandler("print", onPrintClick),
|
|
739
|
+
onClick: toolbar.getHandler("print", onPrintClick || handlePrint),
|
|
614
740
|
disabled: toolbar.isDisabled("print"),
|
|
615
741
|
title: toolbar.getLabel("print") || "Print",
|
|
616
742
|
"aria-label": "Print TIFF",
|
|
@@ -739,4 +865,4 @@ var TIFFViewer = (props) => {
|
|
|
739
865
|
|
|
740
866
|
|
|
741
867
|
exports.TIFFViewer = TIFFViewer;
|
|
742
|
-
//# sourceMappingURL=chunk-
|
|
868
|
+
//# sourceMappingURL=chunk-MPTCXAXO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/premkumar/Documents/GitHub/DMS-File-Viewers/packages/lib/dist/chunk-MPTCXAXO.js","../src/components/viewers/TIFFViewer.tsx"],"names":["imageUrl","width","height"],"mappings":"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","file":"/home/premkumar/Documents/GitHub/DMS-File-Viewers/packages/lib/dist/chunk-MPTCXAXO.js","sourcesContent":[null,"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 * as UTIF from \"utif\";\nimport type { UTIFImage } from \"utif\";\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 // Annotation-related FileViewerProps (PDF only) — extract so they don't\n // leak onto the DOM via {...props} on <Box>.\n showAnnotations,\n userDetails,\n annotationSelectionMenu,\n isHighlighterActive,\n isStampActive,\n isNoteActive,\n onHighlighterClick,\n onStampClick,\n onSignatureClick,\n onNoteClick,\n permissions,\n isAnnotationForeign,\n onAnnotationNoteClick,\n isAnnotationInteractive,\n hasUnsavedAnnotations,\n isSavingAnnotations,\n canSaveAnnotations,\n onSaveAnnotations,\n onDownloadWithAnnotations,\n onDownloadWithoutAnnotations,\n onPrintWithAnnotations,\n onPrintWithoutAnnotations,\n showDownloadOriginal,\n showDownloadWithAnnotations,\n showPrintOriginal,\n showPrintWithAnnotations,\n showAnnotate,\n disabledAnnotate,\n showRotation,\n defaultFitToPage,\n loading,\n onPasswordRequest,\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 [, 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 // Local TIFF decoding state — used when no external pageLoader is provided\n // (e.g. direct file uploads in the demo). When pageLoader IS provided\n // (server-converted streaming flow), this remains inert.\n const [localTotalPages, setLocalTotalPages] = useState(0);\n const tiffSourceRef = useRef<{ buffer: ArrayBuffer; ifds: UTIFImage[] } | null>(null);\n\n // Prefer the locally-discovered count (UTIF parsed real IFDs) over the\n // prop, which can be stale or unset on older files whose server-side\n // metadata extraction predates the MEDIA_SERVICE_URL fix.\n const effectiveTotalPages = localTotalPages || totalPages;\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 // Decode a single TIFF IFD into a PNG ArrayBuffer using the cached source\n const decodeLocalPage = useCallback(\n async (pageIndex: number): Promise<ArrayBuffer | null> => {\n const source = tiffSourceRef.current;\n if (!source) return null;\n const image = source.ifds[pageIndex];\n if (!image) return null;\n UTIF.decodeImage(source.buffer, image);\n const rgba = UTIF.toRGBA8(image);\n const width = Number(image.width) || 0;\n const height = Number(image.height) || 0;\n if (!width || !height) return null;\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n ctx.putImageData(\n new ImageData(new Uint8ClampedArray(rgba), width, height),\n 0,\n 0\n );\n return await new Promise<ArrayBuffer | null>((resolve) => {\n canvas.toBlob(async (blob) => {\n if (!blob) {\n resolve(null);\n return;\n }\n resolve(await blob.arrayBuffer());\n }, \"image/png\");\n });\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 // Decode TIFF locally to discover page count (and, when no external\n // pageLoader is provided, also render pages locally).\n //\n // Two scenarios:\n // 1. No pageLoader (demo / direct upload): we fully own rendering —\n // decode page 1 to a PNG blob and display it. Subsequent pages\n // decoded on demand via handlePageChange.\n // 2. pageLoader provided (server-converted flow with the full decrypted\n // buffer available client-side, e.g. DMS-Client-Drive secure-view):\n // we still parse IFDs to discover the real page count, since the\n // server-side `properties.pageCount` metadata can be missing on\n // older files. pageLoader keeps handling per-page rendering.\n //\n // Skipped when only a `url` is provided alongside `pageLoader` — that\n // implies a controlled per-page fetch model we shouldn't bypass.\n useEffect(() => {\n if (!file && !url) {\n tiffSourceRef.current = null;\n setLocalTotalPages(0);\n return;\n }\n\n let cancelled = false;\n\n (async () => {\n try {\n // Acquire raw bytes for UTIF.decode (IFD parsing only — cheap).\n let buffer: ArrayBuffer | null = null;\n if (file) {\n buffer = await file.arrayBuffer();\n } else if (url && !pageLoader) {\n buffer = await (await fetch(url)).arrayBuffer();\n }\n if (cancelled || !buffer) return;\n\n const ifds = UTIF.decode(buffer);\n if (!ifds.length) {\n throw new Error(\"No pages found in TIFF\");\n }\n\n tiffSourceRef.current = { buffer, ifds };\n setLocalTotalPages(ifds.length);\n\n // Only render locally when there's no external pageLoader.\n if (pageLoader) return;\n\n setInternalLoading(true);\n setError(null);\n setImageUrl(null);\n setImageSize(null);\n setPageImages((prev) => {\n prev.forEach((u) => URL.revokeObjectURL(u));\n return new Map();\n });\n\n const firstPage = await decodeLocalPage(0);\n if (cancelled) return;\n if (!firstPage) {\n throw new Error(\"Failed to decode TIFF page 1\");\n }\n updatePageImage(firstPage, 1);\n onLoad?.();\n } catch (err) {\n if (cancelled) return;\n const message =\n err instanceof Error ? err.message : \"Failed to decode TIFF\";\n // Surface error only when local decode is the rendering path;\n // when pageLoader handles rendering, its own error channel applies.\n if (!pageLoader) {\n setError(message);\n onError?.(new Error(message));\n } else {\n console.warn(`[TIFFViewer] Local IFD count failed: ${message}`);\n }\n } finally {\n if (!cancelled && !pageLoader) setInternalLoading(false);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [file, url, pageLoader, decodeLocalPage, updatePageImage, onLoad, onError]);\n\n // Handle internal page navigation\n const handlePageChange = useCallback(\n async (newPageNumber: number) => {\n const hasExternalLoader = !!pageLoaderRef.current;\n const hasLocalSource = !!tiffSourceRef.current;\n if (!hasExternalLoader && !hasLocalSource) {\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 setError(null);\n\n try {\n const pageData = hasExternalLoader\n ? await pageLoaderRef.current!(newPageNumber)\n : await decodeLocalPage(newPageNumber - 1);\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 }\n },\n [pageImages, onError, updatePageImage, decodeLocalPage]\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 // Reset view state on new file/url. The actual imageUrl is set by either\n // the external pageLoader effect (server-converted flow) or the local\n // TIFF decode effect — both produce decoded PNG blobs, never raw TIFF,\n // since browsers can't render raw TIFF in <img>.\n if (resetPage) {\n setCurrentPage(1);\n setFitMode(\"fit-page\");\n setZoom(100);\n }\n setIsLoading(false);\n },\n [file, url]\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 = effectiveTotalPages > 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(effectiveTotalPages);\n }, [handlePageChange, effectiveTotalPages]);\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, effectiveTotalPages);\n if (newPage !== currentPage) {\n handlePageChange(newPage);\n }\n }, [currentPage, effectiveTotalPages, handlePageChange]);\n\n const handleToggleFullScreen = useCallback(() => {\n if (!document.fullscreenElement && containerRef.current?.requestFullscreen) {\n containerRef.current.requestFullscreen();\n } else if (document.fullscreenElement && document.exitFullscreen) {\n document.exitFullscreen();\n }\n }, []);\n\n // Keep isFullScreen in sync with the actual fullscreen state so the\n // toolbar reflects Escape-to-exit and the next click re-enters cleanly.\n useEffect(() => {\n const onFullscreenChange = () => {\n setIsFullScreen(!!document.fullscreenElement);\n };\n document.addEventListener(\"fullscreenchange\", onFullscreenChange);\n return () => {\n document.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n };\n }, []);\n\n // Default print handler — opens the current page image in a popup and\n // triggers the browser print dialog. Used when the host doesn't supply\n // an onPrintClick callback.\n const handlePrint = useCallback(() => {\n if (!imageUrl) return;\n const printWindow = window.open(\"\", \"_blank\", \"width=900,height=1200\");\n if (!printWindow) return;\n const doc = printWindow.document;\n doc.title = resolvedFileName || \"Document\";\n const style = doc.createElement(\"style\");\n style.textContent =\n \"@page { margin: 0.5cm; }\" +\n \"html, body { margin: 0; padding: 0; }\" +\n \"img { display: block; width: 100%; height: auto; page-break-after: always; }\";\n doc.head.appendChild(style);\n const img = doc.createElement(\"img\");\n img.alt = resolvedFileName || \"Document\";\n img.onload = () => {\n window.setTimeout(() => printWindow.print(), 100);\n };\n img.src = imageUrl;\n doc.body.appendChild(img);\n }, [imageUrl, resolvedFileName]);\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 {effectiveTotalPages}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={handleNextPage}\n disabled={currentPage === effectiveTotalPages}\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 === effectiveTotalPages}\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 || handlePrint)}\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"]}
|
|
@@ -42,7 +42,8 @@ var StablePDFViewer = React.memo(({
|
|
|
42
42
|
permissions,
|
|
43
43
|
hideInternalLoading,
|
|
44
44
|
isAnnotationForeign,
|
|
45
|
-
onAnnotationNoteClick
|
|
45
|
+
onAnnotationNoteClick,
|
|
46
|
+
isAnnotationInteractive
|
|
46
47
|
}) => {
|
|
47
48
|
return /* @__PURE__ */ jsx(
|
|
48
49
|
HeadlessPDFViewer,
|
|
@@ -62,7 +63,8 @@ var StablePDFViewer = React.memo(({
|
|
|
62
63
|
permissions,
|
|
63
64
|
hideInternalLoading,
|
|
64
65
|
isAnnotationForeign,
|
|
65
|
-
onAnnotationNoteClick
|
|
66
|
+
onAnnotationNoteClick,
|
|
67
|
+
isAnnotationInteractive
|
|
66
68
|
}
|
|
67
69
|
);
|
|
68
70
|
});
|
|
@@ -1357,6 +1359,7 @@ var PDFViewerContent = forwardRef(
|
|
|
1357
1359
|
onNoteClick,
|
|
1358
1360
|
isAnnotationForeign,
|
|
1359
1361
|
onAnnotationNoteClick,
|
|
1362
|
+
isAnnotationInteractive,
|
|
1360
1363
|
// New granular toolbar props
|
|
1361
1364
|
showAnnotate,
|
|
1362
1365
|
disabledAnnotate,
|
|
@@ -2246,7 +2249,8 @@ var PDFViewerContent = forwardRef(
|
|
|
2246
2249
|
onNoteClick,
|
|
2247
2250
|
permissions: props.permissions,
|
|
2248
2251
|
isAnnotationForeign,
|
|
2249
|
-
onAnnotationNoteClick
|
|
2252
|
+
onAnnotationNoteClick,
|
|
2253
|
+
isAnnotationInteractive
|
|
2250
2254
|
}
|
|
2251
2255
|
) }),
|
|
2252
2256
|
/* @__PURE__ */ jsx6(
|
|
@@ -2292,4 +2296,4 @@ PDFViewer.displayName = "PDFViewer";
|
|
|
2292
2296
|
export {
|
|
2293
2297
|
PDFViewer
|
|
2294
2298
|
};
|
|
2295
|
-
//# sourceMappingURL=chunk-
|
|
2299
|
+
//# sourceMappingURL=chunk-PZGUVU6N.mjs.map
|