@nu-art/ts-pdf-frontend 0.401.8 → 0.500.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/package.json +2 -4
- package/ui/PDF_Loader.d.ts +3 -0
- package/ui/PDF_Loader.js +5 -0
- package/ui/PDF_Renderer.d.ts +6 -11
- package/ui/PDF_Renderer.js +18 -32
- package/ui/PDF_Renderer.scss +23 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nu-art/ts-pdf-frontend",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.500.0",
|
|
4
4
|
"description": "ts-pdf - Express & Typescript based backend framework Frontend",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"TacB0sS",
|
|
@@ -31,9 +31,7 @@
|
|
|
31
31
|
"build": "tsc"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@nu-art/ts-common": "0.
|
|
35
|
-
"@nu-art/thunderstorm-frontend": "0.401.8",
|
|
36
|
-
"@nu-art/thunderstorm-shared": "0.401.8",
|
|
34
|
+
"@nu-art/ts-common": "0.500.0",
|
|
37
35
|
"react": "^18.0.0",
|
|
38
36
|
"pdf.js": "^0.1.0",
|
|
39
37
|
"pdfjs-dist": "5.4.149"
|
package/ui/PDF_Loader.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/** Minimal loading spinner for PDF_Renderer. No external UI dependency. */
|
|
3
|
+
export function PDF_Loader(props) {
|
|
4
|
+
return (_jsx("div", { ...props, className: props.className ? `pdf-loader ${props.className}` : 'pdf-loader', children: _jsx("div", { className: "pdf-loader__spinner" }) }));
|
|
5
|
+
}
|
package/ui/PDF_Renderer.d.ts
CHANGED
|
@@ -1,32 +1,27 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import './PDF_Renderer.scss';
|
|
3
|
-
import { ComponentAsync } from '@nu-art/thunderstorm-frontend/index';
|
|
4
3
|
import { PDFDocumentProxy } from 'pdfjs-dist';
|
|
5
4
|
type State = {
|
|
6
5
|
index: number;
|
|
7
6
|
pdfFile?: PDFDocumentProxy;
|
|
8
7
|
width: number;
|
|
9
8
|
height: number;
|
|
9
|
+
isLoading?: boolean;
|
|
10
|
+
error?: string;
|
|
10
11
|
};
|
|
11
12
|
type Props = {
|
|
12
13
|
pageIndex?: number;
|
|
13
14
|
src: string;
|
|
14
15
|
};
|
|
15
|
-
export declare class PDF_Renderer extends
|
|
16
|
+
export declare class PDF_Renderer extends React.Component<Props, State> {
|
|
16
17
|
private ctx;
|
|
17
18
|
private textLayer;
|
|
18
19
|
constructor(props: Props);
|
|
19
|
-
protected deriveStateFromProps(nextProps: Props): Promise<{
|
|
20
|
-
index: number;
|
|
21
|
-
isLoading: boolean;
|
|
22
|
-
width: number;
|
|
23
|
-
height: number;
|
|
24
|
-
}>;
|
|
25
20
|
private loadPdf;
|
|
26
|
-
componentDidMount():
|
|
27
|
-
componentDidUpdate(prevProps: Readonly<Props
|
|
21
|
+
componentDidMount(): void;
|
|
22
|
+
componentDidUpdate(prevProps: Readonly<Props>): void;
|
|
28
23
|
render(): import("react/jsx-runtime").JSX.Element;
|
|
29
|
-
renderState
|
|
24
|
+
private renderState;
|
|
30
25
|
private renderPage;
|
|
31
26
|
}
|
|
32
27
|
export {};
|
package/ui/PDF_Renderer.js
CHANGED
|
@@ -1,22 +1,18 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from 'react';
|
|
2
3
|
import './PDF_Renderer.scss';
|
|
3
4
|
import { ModuleFE_PDF } from '../modules/ModuleFE_PDF.js';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
export class PDF_Renderer extends ComponentAsync {
|
|
5
|
+
import { PDF_Loader } from './PDF_Loader.js';
|
|
6
|
+
export class PDF_Renderer extends React.Component {
|
|
7
7
|
ctx;
|
|
8
8
|
textLayer;
|
|
9
9
|
constructor(props) {
|
|
10
10
|
super(props);
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const state = {
|
|
14
|
-
index: nextProps.pageIndex || 1,
|
|
15
|
-
isLoading: false,
|
|
11
|
+
this.state = {
|
|
12
|
+
index: props.pageIndex ?? 1,
|
|
16
13
|
width: 500,
|
|
17
|
-
height: 500
|
|
14
|
+
height: 500,
|
|
18
15
|
};
|
|
19
|
-
return state;
|
|
20
16
|
}
|
|
21
17
|
async loadPdf(pdfSrc) {
|
|
22
18
|
this.setState({ isLoading: true });
|
|
@@ -27,51 +23,41 @@ export class PDF_Renderer extends ComponentAsync {
|
|
|
27
23
|
this.setState({ isLoading: false });
|
|
28
24
|
}
|
|
29
25
|
catch (err) {
|
|
30
|
-
this.setState({ error: err.message, isLoading: false });
|
|
26
|
+
this.setState({ error: err instanceof Error ? err.message : String(err), isLoading: false });
|
|
31
27
|
}
|
|
32
28
|
}
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
componentDidMount() {
|
|
30
|
+
void this.loadPdf(this.props.src);
|
|
35
31
|
}
|
|
36
|
-
|
|
37
|
-
if (this.props.src !== prevProps.src)
|
|
38
|
-
|
|
39
|
-
}
|
|
32
|
+
componentDidUpdate(prevProps) {
|
|
33
|
+
if (this.props.src !== prevProps.src)
|
|
34
|
+
void this.loadPdf(this.props.src);
|
|
40
35
|
}
|
|
41
36
|
render() {
|
|
42
|
-
return _jsxs(_Fragment, { children: [_jsx("div", { className:
|
|
37
|
+
return _jsxs(_Fragment, { children: [_jsx("div", { className: "pdf-renderer", ref: instance => {
|
|
43
38
|
if (!instance)
|
|
44
39
|
return;
|
|
45
40
|
if (!this.ctx)
|
|
46
41
|
this.ctx = ModuleFE_PDF.appendCanvas(instance, { position: 'absolute' });
|
|
47
42
|
}, children: this.renderState() }), _jsx("div", { ref: instance => {
|
|
48
|
-
if (
|
|
49
|
-
return;
|
|
50
|
-
if (!this.textLayer)
|
|
43
|
+
if (instance)
|
|
51
44
|
this.textLayer = instance;
|
|
52
45
|
} })] });
|
|
53
|
-
// new Array(this.state.pdfFile?._pdfInfo.numPages || 0)
|
|
54
|
-
// .fill(0)
|
|
55
|
-
// .map((val, index) => <div key={index} className="clickable" style={{margin: "5px", padding: "3px"}}
|
|
56
|
-
// onClick={async () => {
|
|
57
|
-
// await this.renderPage(index + 1);
|
|
58
|
-
// }}>{index + 1}</div>);
|
|
59
46
|
}
|
|
60
47
|
renderState() {
|
|
61
48
|
if (this.state.isLoading)
|
|
62
|
-
return _jsx(
|
|
49
|
+
return _jsx(PDF_Loader, {});
|
|
63
50
|
if (this.state.error)
|
|
64
|
-
return _jsx("div", { children:
|
|
51
|
+
return _jsx("div", { className: "pdf-renderer-error", children: this.state.error });
|
|
52
|
+
return null;
|
|
65
53
|
}
|
|
66
54
|
async renderPage(index) {
|
|
67
55
|
const pdfFile = this.state.pdfFile;
|
|
68
56
|
if (!pdfFile) {
|
|
69
|
-
|
|
57
|
+
console.warn('PDF_Renderer: cannot render pdfFile - undefined');
|
|
70
58
|
return;
|
|
71
59
|
}
|
|
72
|
-
this.logInfo(`isLoading page ${index}`);
|
|
73
60
|
const viewport = await ModuleFE_PDF.renderPage(this.ctx, pdfFile, index, this.textLayer);
|
|
74
|
-
this.logInfo(`loaded page ${index}`);
|
|
75
61
|
this.setState({ index, width: viewport.width, height: viewport.height });
|
|
76
62
|
}
|
|
77
63
|
}
|
package/ui/PDF_Renderer.scss
CHANGED
|
@@ -2,4 +2,27 @@
|
|
|
2
2
|
position: relative;
|
|
3
3
|
width: 500px;
|
|
4
4
|
height: 500px;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.pdf-loader {
|
|
8
|
+
display: flex;
|
|
9
|
+
align-items: center;
|
|
10
|
+
justify-content: center;
|
|
11
|
+
width: 100%;
|
|
12
|
+
height: 100%;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.pdf-loader__spinner {
|
|
16
|
+
width: 32px;
|
|
17
|
+
height: 32px;
|
|
18
|
+
border: 3px solid rgba(0, 0, 0, 0.1);
|
|
19
|
+
border-top-color: #333;
|
|
20
|
+
border-radius: 50%;
|
|
21
|
+
animation: pdf-loader-spin 0.8s linear infinite;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@keyframes pdf-loader-spin {
|
|
25
|
+
to {
|
|
26
|
+
transform: rotate(360deg);
|
|
27
|
+
}
|
|
5
28
|
}
|