@dvrd/dvr-controls 0.0.33 → 0.0.37
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 +1 -1
- package/src/js/date/style/dvrdDatePicker.scss +1 -0
- package/src/js/pdf/image/pdfImage.tsx +3 -1
- package/src/js/pdf/pdfTemplateCreator.tsx +10 -6
- package/src/js/pdf/settings/image/pdfImageSettings.tsx +17 -2
- package/src/js/pdf/settings/pdfElementSettings.tsx +7 -4
- package/src/js/pdf/settings/text/pdfTextSettings.tsx +18 -2
- package/src/js/pdf/text/pdfText.tsx +19 -6
- package/src/js/select/dvrdSelectController.tsx +1 -1
- package/src/js/textField/dvrdNumberInput.tsx +1 -0
- package/src/js/util/interfaces.ts +2 -2
package/package.json
CHANGED
|
@@ -28,7 +28,7 @@ interface Props {
|
|
|
28
28
|
|
|
29
29
|
interface State {
|
|
30
30
|
dragging: boolean;
|
|
31
|
-
settings: { img: string; persistent: PDFElementPersist; alignment?: ElementPosition };
|
|
31
|
+
settings: { img: string; persistent: PDFElementPersist; alignment?: ElementPosition; multiPage?: boolean };
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
export default class PdfImage extends PdfElement<Props, State> {
|
|
@@ -46,6 +46,7 @@ export default class PdfImage extends PdfElement<Props, State> {
|
|
|
46
46
|
img: props.values?.default_image || '',
|
|
47
47
|
persistent: PDFElementPersist.NOT_PERSISTENT,
|
|
48
48
|
alignment: undefined,
|
|
49
|
+
multiPage: false,
|
|
49
50
|
}, props.defaultSettings),
|
|
50
51
|
dragging: false,
|
|
51
52
|
};
|
|
@@ -124,6 +125,7 @@ export default class PdfImage extends PdfElement<Props, State> {
|
|
|
124
125
|
img: this.image ?? nullify(settings.img),
|
|
125
126
|
persistent: settings.persistent,
|
|
126
127
|
alignment: settings.alignment,
|
|
128
|
+
multiPage: settings.multiPage,
|
|
127
129
|
},
|
|
128
130
|
};
|
|
129
131
|
};
|
|
@@ -30,6 +30,7 @@ interface Props {
|
|
|
30
30
|
mainFont: PdfFont;
|
|
31
31
|
disableElements: ('text' | 'image' | 'invoiceTable')[];
|
|
32
32
|
maxWidth?: string;
|
|
33
|
+
supportMultiPage: boolean;
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
interface State {
|
|
@@ -43,6 +44,7 @@ export default class PDFTemplateCreator extends PureComponent<Props, State> {
|
|
|
43
44
|
static defaultProps = {
|
|
44
45
|
values: {},
|
|
45
46
|
disableElements: [],
|
|
47
|
+
supportMultiPage: false,
|
|
46
48
|
};
|
|
47
49
|
|
|
48
50
|
private readonly id: string = generateComponentId(this.props.id, true);
|
|
@@ -220,7 +222,9 @@ export default class PDFTemplateCreator extends PureComponent<Props, State> {
|
|
|
220
222
|
|
|
221
223
|
render = () => {
|
|
222
224
|
const {elements, focusedElement, canUndo, canRedo,} = this.state,
|
|
223
|
-
{
|
|
225
|
+
{
|
|
226
|
+
customVariables, onPreview, mainFont, disableElements, onClickProceed, maxWidth, supportMultiPage
|
|
227
|
+
} = this.props;
|
|
224
228
|
return (
|
|
225
229
|
<div className='pdf-creator' onClick={this.onResetElement}
|
|
226
230
|
style={{maxWidth: maxWidth ?? '100%'}}>
|
|
@@ -229,17 +233,17 @@ export default class PDFTemplateCreator extends PureComponent<Props, State> {
|
|
|
229
233
|
<div>
|
|
230
234
|
<Button onClick={this.onSubmit} label='Opslaan'/>
|
|
231
235
|
{onClickProceed !== undefined &&
|
|
232
|
-
|
|
236
|
+
<Button onClick={this.onClickProceed} label='Naar volgende stap' className='proceed-btn'/>}
|
|
233
237
|
</div>
|
|
234
238
|
</div>
|
|
235
239
|
<div/>
|
|
236
240
|
<div className='elements-container'>
|
|
237
241
|
{!disableElements.includes('image') &&
|
|
238
|
-
|
|
242
|
+
this.renderElementButton('image', 'Afbeelding', PDFElementType.IMAGE)}
|
|
239
243
|
{!disableElements.includes('text') &&
|
|
240
|
-
|
|
244
|
+
this.renderElementButton('font', 'Tekst', PDFElementType.TEXT)}
|
|
241
245
|
{!disableElements.includes('invoiceTable') &&
|
|
242
|
-
|
|
246
|
+
this.renderElementButton('list', 'Factuurregels', PDFElementType.INVOICE_TABLE)}
|
|
243
247
|
<div className='history'>
|
|
244
248
|
<div className={classNames('history-button', !canUndo && 'disabled')}
|
|
245
249
|
onClick={canUndo ? this.onUndo : voidFunction}
|
|
@@ -266,7 +270,7 @@ export default class PDFTemplateCreator extends PureComponent<Props, State> {
|
|
|
266
270
|
<div className='right-col'>
|
|
267
271
|
<PdfElementSettings element={focusedElement} onReset={this.onResetElement}
|
|
268
272
|
customVariables={customVariables} font={mainFont}
|
|
269
|
-
onChangeFont={this.onChangeFont}/>
|
|
273
|
+
onChangeFont={this.onChangeFont} supportMultiPage={supportMultiPage}/>
|
|
270
274
|
</div>
|
|
271
275
|
</div>
|
|
272
276
|
)
|
|
@@ -5,15 +5,17 @@ import './style/pdfImageSettings.scss';
|
|
|
5
5
|
|
|
6
6
|
import React, {PureComponent} from 'react';
|
|
7
7
|
import PdfImage from "../../image/pdfImage";
|
|
8
|
-
import {Button, ElementPosition} from "../../../../../index";
|
|
8
|
+
import {Button, Checkbox, ElementPosition} from "../../../../../index";
|
|
9
9
|
import IconButton, {IconButtonType} from "../buttons/iconButton";
|
|
10
10
|
|
|
11
11
|
interface Props {
|
|
12
12
|
element: PdfImage;
|
|
13
|
+
supportMultiPage: boolean;
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
interface State {
|
|
16
17
|
alignment?: ElementPosition;
|
|
18
|
+
multiPage: boolean;
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
export default class PdfImageSettings extends PureComponent<Props, State> {
|
|
@@ -22,9 +24,17 @@ export default class PdfImageSettings extends PureComponent<Props, State> {
|
|
|
22
24
|
const settings = props.element.getSettings();
|
|
23
25
|
this.state = {
|
|
24
26
|
alignment: settings.alignment,
|
|
27
|
+
multiPage: settings.multiPage ?? false,
|
|
25
28
|
};
|
|
26
29
|
}
|
|
27
30
|
|
|
31
|
+
onToggleMultiPage = (checked: boolean) => {
|
|
32
|
+
const {element} = this.props;
|
|
33
|
+
element.setSetting('multiPage', checked, () => {
|
|
34
|
+
this.setState({multiPage: checked});
|
|
35
|
+
})
|
|
36
|
+
};
|
|
37
|
+
|
|
28
38
|
onToggleAlignment = (type: IconButtonType) => () => {
|
|
29
39
|
const {alignment} = this.state, {element} = this.props;
|
|
30
40
|
let nextAlignment: ElementPosition | undefined;
|
|
@@ -40,9 +50,14 @@ export default class PdfImageSettings extends PureComponent<Props, State> {
|
|
|
40
50
|
}
|
|
41
51
|
|
|
42
52
|
render = () => {
|
|
43
|
-
const {element} = this.props, {alignment} = this.state;
|
|
53
|
+
const {element, supportMultiPage} = this.props, {alignment, multiPage} = this.state;
|
|
44
54
|
return (
|
|
45
55
|
<div className='pdf-image-settings'>
|
|
56
|
+
{supportMultiPage && <>
|
|
57
|
+
<label className='settings-title'>Pagina's</label>
|
|
58
|
+
<Checkbox checked={multiPage} onCheck={this.onToggleMultiPage} label={'Toon op alle pagina\'s'}/>
|
|
59
|
+
</>}
|
|
60
|
+
<div className='divider'/>
|
|
46
61
|
<label className='settings-title'>Uitlijning</label>
|
|
47
62
|
<div className='alignment'>
|
|
48
63
|
<IconButton onClick={this.onToggleAlignment} active={alignment === ElementPosition.LEFT}
|
|
@@ -20,6 +20,7 @@ interface Props {
|
|
|
20
20
|
element: PdfElement | null;
|
|
21
21
|
customVariables?: PDFTextVariables;
|
|
22
22
|
font: PdfFont;
|
|
23
|
+
supportMultiPage: boolean;
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
export default class PdfElementSettings extends PureComponent<Props> {
|
|
@@ -45,10 +46,12 @@ export default class PdfElementSettings extends PureComponent<Props> {
|
|
|
45
46
|
};
|
|
46
47
|
|
|
47
48
|
renderSettings = () => {
|
|
48
|
-
const {element, customVariables} = this.props;
|
|
49
|
+
const {element, customVariables, supportMultiPage} = this.props;
|
|
49
50
|
if (element === null) return this.renderMainSettings();
|
|
50
|
-
if (element instanceof PdfText) return <PdfTextSettings element={element} customVariables={customVariables}
|
|
51
|
-
|
|
51
|
+
if (element instanceof PdfText) return <PdfTextSettings element={element} customVariables={customVariables}
|
|
52
|
+
supportMultiPage={supportMultiPage}/>;
|
|
53
|
+
if (element instanceof PdfImage) return <PdfImageSettings element={element}
|
|
54
|
+
supportMultiPage={supportMultiPage}/>;
|
|
52
55
|
if (element instanceof PdfInvoiceTable) return <PdfInvoiceTableSettings element={element}/>
|
|
53
56
|
return null;
|
|
54
57
|
};
|
|
@@ -74,7 +77,7 @@ export default class PdfElementSettings extends PureComponent<Props> {
|
|
|
74
77
|
<div className='buttons-container'>
|
|
75
78
|
<Button onClick={onReset} label='Oké' className='reset-btn'/>
|
|
76
79
|
{deleteAble &&
|
|
77
|
-
|
|
80
|
+
<Button onClick={this.onClickDelete} label='Verwijderen' primary={false} textColor='red'/>}
|
|
78
81
|
</div>
|
|
79
82
|
)}
|
|
80
83
|
</div>
|
|
@@ -6,13 +6,14 @@ import './style/pdfTextSettings.scss';
|
|
|
6
6
|
import React, {PureComponent} from 'react';
|
|
7
7
|
import PdfText from "../../text/pdfText";
|
|
8
8
|
import {ElementPosition, IndexedObject, PdfFont, PDFTextParams, PDFTextVariables} from "../../../util/interfaces";
|
|
9
|
-
import {ColorPicker, fontItems, getPdfVariables, NumberField, Select} from "../../../../../index";
|
|
9
|
+
import {Checkbox, ColorPicker, fontItems, getPdfVariables, NumberField, Select} from "../../../../../index";
|
|
10
10
|
import classNames from 'classnames';
|
|
11
11
|
import IconButton, {IconButtonType} from "../buttons/iconButton";
|
|
12
12
|
|
|
13
13
|
interface Props {
|
|
14
14
|
element: PdfText;
|
|
15
15
|
customVariables?: PDFTextVariables;
|
|
16
|
+
supportMultiPage: boolean;
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
interface State extends IndexedObject<any> {
|
|
@@ -24,6 +25,7 @@ interface State extends IndexedObject<any> {
|
|
|
24
25
|
font: PdfFont;
|
|
25
26
|
color: string;
|
|
26
27
|
colorPickerActive: boolean;
|
|
28
|
+
multiPage: boolean;
|
|
27
29
|
}
|
|
28
30
|
|
|
29
31
|
export default class PdfTextSettings extends PureComponent<Props, State> {
|
|
@@ -39,9 +41,17 @@ export default class PdfTextSettings extends PureComponent<Props, State> {
|
|
|
39
41
|
font: settings.font,
|
|
40
42
|
color: settings.color,
|
|
41
43
|
colorPickerActive: false,
|
|
44
|
+
multiPage: settings.multiPage ?? false,
|
|
42
45
|
};
|
|
43
46
|
}
|
|
44
47
|
|
|
48
|
+
onToggleMultiPage = (checked: boolean) => {
|
|
49
|
+
const {element} = this.props;
|
|
50
|
+
element.setSetting('multiPage', checked, () => {
|
|
51
|
+
this.setState({multiPage: checked});
|
|
52
|
+
})
|
|
53
|
+
};
|
|
54
|
+
|
|
45
55
|
onCloseColorPicker = () => {
|
|
46
56
|
this.setState({colorPickerActive: false});
|
|
47
57
|
};
|
|
@@ -125,10 +135,16 @@ export default class PdfTextSettings extends PureComponent<Props, State> {
|
|
|
125
135
|
);
|
|
126
136
|
|
|
127
137
|
render = () => {
|
|
128
|
-
const {element
|
|
138
|
+
const {element, supportMultiPage} = this.props,
|
|
139
|
+
{bold, underline, italic, alignment, colorPickerActive, color, multiPage} = this.state,
|
|
129
140
|
settings: PDFTextParams = element.getSettings();
|
|
130
141
|
return (
|
|
131
142
|
<div className='pdf-text-settings'>
|
|
143
|
+
{supportMultiPage && <>
|
|
144
|
+
<label className='settings-title'>Pagina's</label>
|
|
145
|
+
<Checkbox checked={multiPage} onCheck={this.onToggleMultiPage} label={'Toon op alle pagina\'s'}/>
|
|
146
|
+
</>}
|
|
147
|
+
<div className='divider'/>
|
|
132
148
|
<div className='text-settings'>
|
|
133
149
|
<IconButton onClick={this.onToggleSetting} active={bold} type={IconButtonType.BOLD}
|
|
134
150
|
title='Vet'/>
|
|
@@ -34,6 +34,7 @@ interface Props {
|
|
|
34
34
|
interface State {
|
|
35
35
|
settings: PDFTextParams;
|
|
36
36
|
dragging: boolean;
|
|
37
|
+
focused: boolean;
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
export default class PdfText extends PdfElement<Props, State> {
|
|
@@ -59,8 +60,10 @@ export default class PdfText extends PdfElement<Props, State> {
|
|
|
59
60
|
font: props.mainFont,
|
|
60
61
|
color: '#000',
|
|
61
62
|
persistent: PDFElementPersist.NOT_PERSISTENT,
|
|
63
|
+
multiPage: false,
|
|
62
64
|
}, props.defaultSettings),
|
|
63
65
|
dragging: false,
|
|
66
|
+
focused: false,
|
|
64
67
|
}
|
|
65
68
|
this.currentText = this.state.settings.text;
|
|
66
69
|
this.events = [this.event, {eventName: 'onLinkedElementMoved', handler: this.onLinkedElementMoved}]
|
|
@@ -68,14 +71,23 @@ export default class PdfText extends PdfElement<Props, State> {
|
|
|
68
71
|
|
|
69
72
|
private onBlur = (evt: React.FocusEvent<HTMLTextAreaElement>) => {
|
|
70
73
|
this.lastKnownCursor = evt.target.selectionEnd || 0;
|
|
74
|
+
this.setState({focused: false}, this.setWidth);
|
|
71
75
|
if (this.state.settings.text !== this.currentText) this.props.onSaveHistory();
|
|
72
76
|
};
|
|
73
77
|
|
|
74
78
|
private onFocus = (evt: React.FocusEvent) => {
|
|
75
79
|
evt.stopPropagation();
|
|
80
|
+
this.setState({focused: true}, this.setWidth);
|
|
76
81
|
this.currentText = this.state.settings.text;
|
|
82
|
+
this.onClick();
|
|
77
83
|
};
|
|
78
84
|
|
|
85
|
+
getTextValue = (): string => {
|
|
86
|
+
const {settings, focused} = this.state, {values} = this.props;
|
|
87
|
+
if (focused) return settings.text;
|
|
88
|
+
return setPdfVariables(settings.text, values);
|
|
89
|
+
}
|
|
90
|
+
|
|
79
91
|
public setSetting = (key: string, value: any, callback?: VoidFunction, save: boolean = true) => {
|
|
80
92
|
this.setState({settings: Object.assign({}, this.state.settings, {[key]: value})}, () => {
|
|
81
93
|
this.setWidth();
|
|
@@ -104,8 +116,9 @@ export default class PdfText extends PdfElement<Props, State> {
|
|
|
104
116
|
this.onClick(evt);
|
|
105
117
|
};
|
|
106
118
|
|
|
107
|
-
onClick = (evt
|
|
108
|
-
evt
|
|
119
|
+
onClick = (evt?: React.MouseEvent) => {
|
|
120
|
+
if (evt)
|
|
121
|
+
evt.stopPropagation();
|
|
109
122
|
this.props.onFocusElement(this);
|
|
110
123
|
if (this.draggable)
|
|
111
124
|
this.draggable.setFocus();
|
|
@@ -168,13 +181,14 @@ export default class PdfText extends PdfElement<Props, State> {
|
|
|
168
181
|
};
|
|
169
182
|
|
|
170
183
|
getParams = (convertPixels: boolean = true): PDFElementParams<PDFElementType.TEXT, PDFTextParams> => {
|
|
171
|
-
const {settings} = this.state,
|
|
184
|
+
const {settings} = this.state,
|
|
185
|
+
{bold, italic, text, underline, alignment, font, color, persistent, multiPage} = settings,
|
|
172
186
|
fontSize = convertPixels ? pxToPt(settings.fontSize) : settings.fontSize, {linkedID} = this.props;
|
|
173
187
|
return {
|
|
174
188
|
dimensions: this.getDimensions(convertPixels),
|
|
175
189
|
key: this.id,
|
|
176
190
|
type: PDFElementType.TEXT,
|
|
177
|
-
options: {fontSize: fontSize, bold, italic, text, underline, alignment, font, color, persistent},
|
|
191
|
+
options: {fontSize: fontSize, bold, italic, text, underline, alignment, font, color, persistent, multiPage},
|
|
178
192
|
linkedID: linkedID,
|
|
179
193
|
};
|
|
180
194
|
}
|
|
@@ -215,7 +229,6 @@ export default class PdfText extends PdfElement<Props, State> {
|
|
|
215
229
|
render = () => {
|
|
216
230
|
const {settings, dragging} = this.state, {
|
|
217
231
|
draggable,
|
|
218
|
-
values,
|
|
219
232
|
defaultPosition,
|
|
220
233
|
onSaveHistory,
|
|
221
234
|
persistent
|
|
@@ -234,7 +247,7 @@ export default class PdfText extends PdfElement<Props, State> {
|
|
|
234
247
|
<div className='pdf-text-container'>
|
|
235
248
|
<textarea className='pdf-text-input' style={this.getTextStyle()}
|
|
236
249
|
readOnly={settings.disabled === true}
|
|
237
|
-
value={sanitizeHtml(
|
|
250
|
+
value={sanitizeHtml(this.getTextValue())} onChange={this.onChange}
|
|
238
251
|
rows={this.getRows()} onFocus={this.onFocus} onBlur={this.onBlur} onClick={this.onClick}
|
|
239
252
|
ref={(ref: HTMLTextAreaElement) => {
|
|
240
253
|
this.field = ref
|
|
@@ -139,8 +139,8 @@ export type DefaultPDFElementParams<T extends PDFElementType, O extends IndexedO
|
|
|
139
139
|
key: string;
|
|
140
140
|
linkedID?: string;
|
|
141
141
|
}>
|
|
142
|
-
export type PDFImageParams = { img: File | string | null, persistent: PDFElementPersist; alignment?: ElementPosition };
|
|
143
|
-
export type PDFTextParams = { bold: boolean; underline: boolean; italic: boolean; fontSize: number; text: string; alignment?: ElementPosition; disabled?: boolean, font: PdfFont, color: string; persistent: PDFElementPersist };
|
|
142
|
+
export type PDFImageParams = { img: File | string | null, persistent: PDFElementPersist; alignment?: ElementPosition; multiPage?: boolean };
|
|
143
|
+
export type PDFTextParams = { bold: boolean; underline: boolean; italic: boolean; fontSize: number; text: string; alignment?: ElementPosition; disabled?: boolean, font: PdfFont, color: string; persistent: PDFElementPersist; multiPage?: boolean };
|
|
144
144
|
export type PDFInvoiceTableParams = { fontSize: number; widths: number[], font: PdfFont, color: string, alignment?: ElementPosition; persistent: PDFElementPersist };
|
|
145
145
|
export type PDFInvoiceWidths = { name: number; price: number; quantity: number; subtotal: number }
|
|
146
146
|
export type PDFTextVariables = { company: IndexedObject<string>; client: IndexedObject<string>; invoice: IndexedObject<string>; }
|