@@ -9,7 +9,7 @@ import { ipcRenderer } from 'electron';
9
9
// @ts -ignore
10
10
import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.entry' ;
11
11
import { StandardFonts , StandardFontValues } from 'pdf-lib' ;
12
- import { Rect , Textbox } from 'fabric/fabric-impl' ;
12
+ import { Rect } from 'fabric/fabric-impl' ;
13
13
import { TwitterPicker } from 'react-color' ;
14
14
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' ;
15
15
import { SizeMe } from 'react-sizeme' ;
@@ -18,6 +18,7 @@ import { useLocation } from 'react-router-dom';
18
18
import { IconName } from '@fortawesome/fontawesome-svg-core' ;
19
19
import { FabricJSCanvas , useFabricJSEditor } from '../fabric/Canvas' ;
20
20
import { readExcelMeta } from '../utils/excel' ;
21
+ import { Fieldbox } from '../fabric/editor' ;
21
22
22
23
pdfjs . GlobalWorkerOptions . workerSrc = pdfjsWorker ;
23
24
export interface DataHeader {
@@ -27,11 +28,8 @@ export interface DataHeader {
27
28
28
29
type Align = 'left' | 'center' | 'right' ;
29
30
30
- interface MyTextbox extends Textbox {
31
- index : number ;
32
- }
33
31
export interface CanvasObjects {
34
- objects : [ MyTextbox | Rect ] ;
32
+ objects : [ Fieldbox | Rect ] ;
35
33
clientWidth : number ;
36
34
}
37
35
export interface RenderPdfState {
@@ -66,6 +64,7 @@ const PdfEditor = () => {
66
64
const [ fill , setFill ] = useState ( '#000' ) ;
67
65
const [ showPicker , setShowPicker ] = useState ( false ) ;
68
66
const [ align , setAlign ] = useState < Align > ( 'left' ) ;
67
+ const [ renderType , setRenderType ] = useState ( 'text' ) ;
69
68
70
69
const [ pdfFile , setPdfFile ] = useState ( '' ) ;
71
70
const [ excelFile , setExcelFile ] = useState ( '' ) ;
@@ -213,6 +212,10 @@ const PdfEditor = () => {
213
212
} ) ) ;
214
213
215
214
const fontSizes = [ 8 , 10 , 12 , 14 , 16 , 18 , 24 , 30 , 36 , 48 , 60 ] ;
215
+ const renderTypes = [
216
+ { value : 'text' , label : 'Text' } ,
217
+ { value : 'qrcode' , label : 'QR code' } ,
218
+ ] ;
216
219
217
220
const handleKeyDown = ( key : string ) => {
218
221
if ( selectedObject ) {
@@ -258,17 +261,19 @@ const PdfEditor = () => {
258
261
fontSize,
259
262
fill,
260
263
textAlign : align as string ,
264
+ renderType,
261
265
} ) ;
262
266
263
267
setCurrentState ( getCurrentState ( ) ) ;
264
- } , [ fontFamily , fontSize , fill , align ] ) ;
268
+ } , [ fontFamily , fontSize , fill , align , renderType ] ) ;
265
269
266
270
useEffect ( ( ) => {
267
- const text = selectedObject as Textbox ;
271
+ const text = selectedObject as Fieldbox ;
268
272
setFontFamily ( text ?. fontFamily || 'Helvetica' ) ;
269
273
setFontSize ( text ?. fontSize || 16 ) ;
270
274
setFill ( ( text ?. fill as string ) || '#000' ) ;
271
275
setAlign ( ( text ?. textAlign as Align ) || 'left' ) ;
276
+ setRenderType ( text ?. renderType || 'text' ) ;
272
277
} , [ selectedObject ] ) ;
273
278
274
279
useEffect ( ( ) => {
@@ -292,7 +297,7 @@ const PdfEditor = () => {
292
297
}
293
298
294
299
setCombinePdf ( currentState . combinePdf ) ;
295
- ipcRenderer . invoke ( 'save-config' , currentState ) ;
300
+ ipcRenderer . invoke ( 'save-config' , getCurrentState ( ) ) ;
296
301
}
297
302
} , [ currentState ] ) ;
298
303
@@ -460,10 +465,23 @@ const PdfEditor = () => {
460
465
selectedObject && ! formLayout ? '' : 'opacity-50 cursor-default'
461
466
} `}
462
467
>
468
+ < select
469
+ className = "w-24"
470
+ onChange = { ( e ) => setRenderType ( e . target . value ) }
471
+ value = { renderType }
472
+ disabled = { ! selectedObject }
473
+ >
474
+ { renderTypes . map ( ( r ) => (
475
+ < option value = { r . value } key = { r . value } >
476
+ { r . label }
477
+ </ option >
478
+ ) ) }
479
+ </ select >
480
+
463
481
< select
464
482
onChange = { ( e ) => setFontFamily ( e . target . value ) }
465
483
value = { fontFamily }
466
- disabled = { ! selectedObject }
484
+ disabled = { ! selectedObject || renderType !== 'text' }
467
485
>
468
486
{ fonts . map ( ( { label, value } ) => (
469
487
< option value = { value } key = { value } >
@@ -478,7 +496,7 @@ const PdfEditor = () => {
478
496
setFontSize ( parseInt ( e . target . value , 10 ) || 16 )
479
497
}
480
498
value = { fontSize }
481
- disabled = { ! selectedObject }
499
+ disabled = { ! selectedObject || renderType !== 'text' }
482
500
>
483
501
{ fontSizes . map ( ( v ) => (
484
502
< option value = { v } key = { v } >
@@ -487,7 +505,11 @@ const PdfEditor = () => {
487
505
) ) }
488
506
</ select >
489
507
490
- < section className = "flex items-center justify-center border-t border-b rounded-sm" >
508
+ < section
509
+ className = { `flex items-center justify-center border-t border-b rounded-sm ${
510
+ renderType !== 'text' ? 'opacity-50' : ''
511
+ } `}
512
+ >
491
513
{ [ 'left' , 'center' , 'right' ] . map ( ( al ) => (
492
514
< button
493
515
type = "button"
@@ -505,12 +527,18 @@ const PdfEditor = () => {
505
527
</ section >
506
528
507
529
< div
508
- className = "p-2 border-2 border-white rounded shadow outline-none w-7 h-7 focus:outline-none focus:ring-2 focus:ring-blue-500"
530
+ className = { `p-2 border-2 border-white rounded shadow outline-none w-7 h-7 focus:outline-none focus:ring-2 focus:ring-blue-500 ${
531
+ renderType !== 'text' ? 'opacity-50 cursor-default' : ''
532
+ } `}
509
533
style = { { backgroundColor : fill } }
510
- onClick = { ( ) => selectedObject && setShowPicker ( true ) }
534
+ onClick = { ( ) =>
535
+ selectedObject && renderType === 'text' && setShowPicker ( true )
536
+ }
511
537
role = "button"
512
538
aria-labelledby = "pick"
513
- onKeyPress = { ( ) => selectedObject && setShowPicker ( true ) }
539
+ onKeyPress = { ( ) =>
540
+ selectedObject && renderType === 'text' && setShowPicker ( true )
541
+ }
514
542
tabIndex = { 0 }
515
543
/>
516
544
{ showPicker ? (
0 commit comments