@dvrd/dvr-controls 1.0.6 → 1.0.9

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.
Files changed (177) hide show
  1. package/package.json +1 -1
  2. package/src/js/button/button.tsx +0 -102
  3. package/src/js/button/buttonController.tsx +0 -179
  4. package/src/js/button/closeButton.tsx +0 -29
  5. package/src/js/button/dvrdButton.tsx +0 -128
  6. package/src/js/button/outlinedButton.tsx +0 -105
  7. package/src/js/button/simpleButton.tsx +0 -163
  8. package/src/js/button/style/button.scss +0 -95
  9. package/src/js/button/style/closeButton.scss +0 -15
  10. package/src/js/button/style/dvrdButton.scss +0 -30
  11. package/src/js/button/style/outlinedButton.scss +0 -84
  12. package/src/js/button/style/simpleButton.scss +0 -80
  13. package/src/js/carousel/DVRCarousel.tsx +0 -163
  14. package/src/js/carousel/DVRCarouselController.tsx +0 -95
  15. package/src/js/carousel/style/DVRCarousel.scss +0 -38
  16. package/src/js/checkbox/checkbox.tsx +0 -147
  17. package/src/js/checkbox/checkboxController.tsx +0 -131
  18. package/src/js/checkbox/style/checkbox.scss +0 -109
  19. package/src/js/colorPicker/colorPicker.tsx +0 -118
  20. package/src/js/colorPicker/style/colorPicker.scss +0 -20
  21. package/src/js/date/dvrdDatePicker.tsx +0 -357
  22. package/src/js/date/style/dvrdDatePicker.scss +0 -307
  23. package/src/js/dialog/dialog.tsx +0 -207
  24. package/src/js/dialog/dialogController.tsx +0 -70
  25. package/src/js/dialog/inlineDialog.tsx +0 -127
  26. package/src/js/dialog/style/dialog.scss +0 -61
  27. package/src/js/events/withEvents.tsx +0 -40
  28. package/src/js/head/DVRHead.tsx +0 -49
  29. package/src/js/header/DVRHeader.tsx +0 -413
  30. package/src/js/header/style/header.scss +0 -206
  31. package/src/js/icon/awesomeIcon.tsx +0 -46
  32. package/src/js/image/imageUpload.tsx +0 -69
  33. package/src/js/image/style/imageUpload.scss +0 -11
  34. package/src/js/info/info.tsx +0 -136
  35. package/src/js/info/style/info.scss +0 -39
  36. package/src/js/input/animated/animatedTextField.tsx +0 -159
  37. package/src/js/input/date/dateField.tsx +0 -360
  38. package/src/js/input/date/dateFieldController.tsx +0 -245
  39. package/src/js/input/date/datePicker/datePicker.tsx +0 -186
  40. package/src/js/input/date/datePicker/style/datePicker.scss +0 -102
  41. package/src/js/input/date/input/dateInput.tsx +0 -213
  42. package/src/js/input/date/style/dateField.scss +0 -40
  43. package/src/js/input/date/timePicker/style/timePicker.scss +0 -95
  44. package/src/js/input/date/timePicker/timePicker.tsx +0 -143
  45. package/src/js/input/editor/DVREditor.tsx +0 -21
  46. package/src/js/input/number/numberInput.tsx +0 -157
  47. package/src/js/input/password/passwordInput.tsx +0 -140
  48. package/src/js/input/password/passwordRules.tsx +0 -48
  49. package/src/js/input/password/style/passwordInput.scss +0 -39
  50. package/src/js/input/password/style/passwordRules.scss +0 -41
  51. package/src/js/input/simple/style/simpleInput.scss +0 -98
  52. package/src/js/input/simple/v2/simpleInputV2.tsx +0 -178
  53. package/src/js/input/style/input.scss +0 -138
  54. package/src/js/input/v2/inputController_v2.tsx +0 -250
  55. package/src/js/input/v2/input_v2.tsx +0 -7
  56. package/src/js/label/label.tsx +0 -196
  57. package/src/js/label/style/label.scss +0 -4
  58. package/src/js/link/link.tsx +0 -38
  59. package/src/js/link/style/link.scss +0 -30
  60. package/src/js/loader/loader.tsx +0 -79
  61. package/src/js/loader/loaderController.tsx +0 -61
  62. package/src/js/loader/style/loader.scss +0 -53
  63. package/src/js/media/media.tsx +0 -72
  64. package/src/js/navigator/navigator.tsx +0 -51
  65. package/src/js/optionsList/dvrdOptionsList.tsx +0 -112
  66. package/src/js/optionsList/style/dvrdOptionsList.scss +0 -84
  67. package/src/js/optionsMenu/optionsMenu.tsx +0 -187
  68. package/src/js/optionsMenu/style/optionsMenu.scss +0 -70
  69. package/src/js/pdf/element/pdfElement.tsx +0 -315
  70. package/src/js/pdf/element/style/pdfElement.scss +0 -111
  71. package/src/js/pdf/history/pdfHistory.ts +0 -57
  72. package/src/js/pdf/image/pdfImage.tsx +0 -175
  73. package/src/js/pdf/image/style/pdfImage.scss +0 -34
  74. package/src/js/pdf/invoiceTable/pdfInvoiceTable.tsx +0 -176
  75. package/src/js/pdf/invoiceTable/style/pdfInvoiceTable.scss +0 -32
  76. package/src/js/pdf/pdfTemplateCreator.tsx +0 -278
  77. package/src/js/pdf/settings/buttons/iconButton.tsx +0 -49
  78. package/src/js/pdf/settings/buttons/style/iconButton.scss +0 -50
  79. package/src/js/pdf/settings/image/pdfImageSettings.tsx +0 -82
  80. package/src/js/pdf/settings/image/style/pdfImageSettings.scss +0 -9
  81. package/src/js/pdf/settings/invoiceTable/pdfInvoiceTableSettings.tsx +0 -141
  82. package/src/js/pdf/settings/invoiceTable/style/pdfInvoiceTableSettings.scss +0 -38
  83. package/src/js/pdf/settings/pdfElementSettings.tsx +0 -86
  84. package/src/js/pdf/settings/style/pdfElementSettings.scss +0 -56
  85. package/src/js/pdf/settings/text/pdfTextSettings.tsx +0 -202
  86. package/src/js/pdf/settings/text/style/pdfTextSettings.scss +0 -94
  87. package/src/js/pdf/style/pdfTemplateCreator.scss +0 -118
  88. package/src/js/pdf/text/pdfText.tsx +0 -267
  89. package/src/js/pdf/text/style/pdfText.scss +0 -22
  90. package/src/js/popup/style/withBackground.scss +0 -29
  91. package/src/js/popup/withBackground.tsx +0 -102
  92. package/src/js/select/async/asyncSelect.tsx +0 -46
  93. package/src/js/select/async/style/asyncSelect.scss +0 -23
  94. package/src/js/select/dvrdSelect.tsx +0 -185
  95. package/src/js/select/dvrdSelectController.tsx +0 -81
  96. package/src/js/select/select.tsx +0 -310
  97. package/src/js/select/selectController.tsx +0 -341
  98. package/src/js/select/style/dvrdSelect.scss +0 -140
  99. package/src/js/select/style/select.scss +0 -199
  100. package/src/js/sidebarMenu/sidebarMenu.tsx +0 -165
  101. package/src/js/sidebarMenu/style/sidebarMenu.scss +0 -161
  102. package/src/js/slider/DVRSlider.tsx +0 -107
  103. package/src/js/slider/style/DVRSlider.scss +0 -88
  104. package/src/js/snackbar/snackbar.tsx +0 -72
  105. package/src/js/snackbar/snackbarController.tsx +0 -104
  106. package/src/js/snackbar/style/snackbar.scss +0 -46
  107. package/src/js/switch/dvrdSwitch.tsx +0 -53
  108. package/src/js/switch/style/dvrdSwitch.scss +0 -47
  109. package/src/js/switch/style/switch.scss +0 -84
  110. package/src/js/switch/switch.tsx +0 -115
  111. package/src/js/switch/switchController.tsx +0 -97
  112. package/src/js/textField/dvrdInput.tsx +0 -217
  113. package/src/js/textField/dvrdInputController.tsx +0 -97
  114. package/src/js/textField/dvrdNumberInput.tsx +0 -141
  115. package/src/js/textField/dvrdPasswordInput.tsx +0 -40
  116. package/src/js/textField/style/dvrdInput.scss +0 -114
  117. package/src/js/textField/style/dvrdPassword.scss +0 -15
  118. package/src/js/topButton/style/topButton.scss +0 -54
  119. package/src/js/topButton/topButton.tsx +0 -135
  120. package/src/js/util/analyticsUtil.ts +0 -41
  121. package/src/js/util/colorUtil.ts +0 -230
  122. package/src/js/util/componentUtil.tsx +0 -59
  123. package/src/js/util/constants.ts +0 -12
  124. package/src/js/util/controlContext.tsx +0 -46
  125. package/src/js/util/controlUtil.ts +0 -107
  126. package/src/js/util/cookieUtil.ts +0 -17
  127. package/src/js/util/eventUtil.ts +0 -65
  128. package/src/js/util/googleUtil.ts +0 -88
  129. package/src/js/util/interfaces.ts +0 -179
  130. package/src/js/util/jwtUtil.ts +0 -72
  131. package/src/js/util/miscUtil.ts +0 -170
  132. package/src/js/util/momentUtil.ts +0 -45
  133. package/src/js/util/pdfUtil.ts +0 -124
  134. package/src/js/util/requestUtil.ts +0 -145
  135. package/src/js/util/responsiveUtil.ts +0 -37
  136. package/src/js/util/validationUtil.ts +0 -13
  137. package/src/res/img/lock-handle.png +0 -0
  138. package/src/res/img/lock-handle.webp +0 -0
  139. package/src/res/img/lock.png +0 -0
  140. package/src/res/img/lock.webp +0 -0
  141. package/src/style/common-icons-variables.scss +0 -140
  142. package/src/style/common-icons.scss +0 -714
  143. package/src/style/common-variables.scss +0 -243
  144. package/src/style/display-breakpoints.scss +0 -141
  145. package/src/style/fonts/common-icons.eot +0 -0
  146. package/src/style/fonts/common-icons.svg +0 -150
  147. package/src/style/fonts/common-icons.ttf +0 -0
  148. package/src/style/fonts/common-icons.woff +0 -0
  149. package/src/style/fonts/common-icons.woff2 +0 -0
  150. package/src/style/fonts/fontAwesome/css/all.css +0 -7003
  151. package/src/style/fonts/fontAwesome/css/all.min.css +0 -6
  152. package/src/style/fonts/fontAwesome/css/brands.css +0 -1423
  153. package/src/style/fonts/fontAwesome/css/brands.min.css +0 -6
  154. package/src/style/fonts/fontAwesome/css/fontawesome.css +0 -5519
  155. package/src/style/fonts/fontAwesome/css/fontawesome.min.css +0 -6
  156. package/src/style/fonts/fontAwesome/css/regular.css +0 -19
  157. package/src/style/fonts/fontAwesome/css/regular.min.css +0 -6
  158. package/src/style/fonts/fontAwesome/css/solid.css +0 -19
  159. package/src/style/fonts/fontAwesome/css/solid.min.css +0 -6
  160. package/src/style/fonts/fontAwesome/css/svg-with-js.css +0 -634
  161. package/src/style/fonts/fontAwesome/css/svg-with-js.min.css +0 -6
  162. package/src/style/fonts/fontAwesome/css/v4-font-face.css +0 -26
  163. package/src/style/fonts/fontAwesome/css/v4-font-face.min.css +0 -6
  164. package/src/style/fonts/fontAwesome/css/v4-shims.css +0 -2146
  165. package/src/style/fonts/fontAwesome/css/v4-shims.min.css +0 -6
  166. package/src/style/fonts/fontAwesome/css/v5-font-face.css +0 -22
  167. package/src/style/fonts/fontAwesome/css/v5-font-face.min.css +0 -6
  168. package/src/style/fonts/fontAwesome/webfonts/fa-brands-400.ttf +0 -0
  169. package/src/style/fonts/fontAwesome/webfonts/fa-brands-400.woff2 +0 -0
  170. package/src/style/fonts/fontAwesome/webfonts/fa-regular-400.ttf +0 -0
  171. package/src/style/fonts/fontAwesome/webfonts/fa-regular-400.woff2 +0 -0
  172. package/src/style/fonts/fontAwesome/webfonts/fa-solid-900.ttf +0 -0
  173. package/src/style/fonts/fontAwesome/webfonts/fa-solid-900.woff2 +0 -0
  174. package/src/style/fonts/fontAwesome/webfonts/fa-v4compatibility.ttf +0 -0
  175. package/src/style/fonts/fontAwesome/webfonts/fa-v4compatibility.woff2 +0 -0
  176. package/src/style/variables.scss +0 -11
  177. package/tsconfig.json +0 -15
@@ -1,176 +0,0 @@
1
- /*
2
- * Copyright (c) 2021. Dave van Rijn Development
3
- */
4
- import './style/pdfInvoiceTable.scss';
5
-
6
- import React, {MouseEventHandler} from 'react';
7
- import {
8
- ElementPosition,
9
- PDFElementParams, PDFElementPersist, PDFElementType, PdfFont, PDFInvoiceTableParams
10
- } from "../../util/interfaces";
11
- import {PDFDraggable, PdfElement} from "../element/pdfElement";
12
- import {merge} from 'lodash';
13
- import {parsePrice, pxToPt} from "../../util/pdfUtil";
14
- import {WithEvents} from "../../../../index";
15
-
16
- interface Props {
17
- onSaveHistory: VoidFunction;
18
- onDelete: MouseEventHandler;
19
- defaultSettings?: Partial<PDFInvoiceTableParams>;
20
- id?: string;
21
- defaultPosition: { x: number; y: number; };
22
- draggable: boolean;
23
- onFocusElement: (element: PdfElement) => void;
24
- width?: number;
25
- height?: number;
26
- persistent?: PDFElementPersist;
27
- mainFont: PdfFont;
28
- }
29
-
30
- interface State {
31
- settings: PDFInvoiceTableParams;
32
- dragging: boolean;
33
- }
34
-
35
- export default class PdfInvoiceTable extends PdfElement<Props, State> {
36
- constructor(props: Props) {
37
- super(props);
38
- this.state = {
39
- settings: merge({}, {
40
- widths: [40, 20, 20, 20],
41
- fontSize: 12,
42
- font: props.mainFont,
43
- color: '#000',
44
- alignment: ElementPosition.CENTER,
45
- persistent: PDFElementPersist.NOT_PERSISTENT,
46
- }, props.defaultSettings),
47
- dragging: false,
48
- };
49
- }
50
-
51
- getParams = (convertPixels: boolean = true): PDFElementParams<PDFElementType.INVOICE_TABLE, PDFInvoiceTableParams> => {
52
- const {settings} = this.state, fontSize = convertPixels ? pxToPt(settings.fontSize) : settings.fontSize;
53
- return {
54
- dimensions: this.getDimensions(convertPixels),
55
- type: PDFElementType.INVOICE_TABLE,
56
- key: this.id,
57
- options: {
58
- widths: settings.widths,
59
- fontSize,
60
- font: settings.font,
61
- color: settings.color,
62
- alignment: settings.alignment,
63
- persistent: settings.persistent,
64
- },
65
- };
66
- }
67
-
68
- onClick = (evt: React.MouseEvent): void => {
69
- evt.stopPropagation();
70
- this.props.onFocusElement(this);
71
- if (this.draggable)
72
- this.draggable.setFocus();
73
- };
74
-
75
- onClickDelete = (): void => {
76
- // Deleting invoice table is not allowed
77
- return;
78
- };
79
-
80
- onClickBar = (evt: React.MouseEvent) => {
81
- this.onClick(evt);
82
- };
83
-
84
- private getRowStyle = (isHeadRow: boolean = false): React.CSSProperties => {
85
- const {widths, fontSize, font, color} = this.state.settings,
86
- style: React.CSSProperties = {fontSize, fontFamily: font, color};
87
- if (isHeadRow) {
88
- style.fontWeight = font === PdfFont.HELVETICA ? 600 : 500;
89
- style.borderBottom = '2px solid #d8d8d8';
90
- }
91
- style.gridTemplateColumns = widths.join('% ') + '%';
92
- return style;
93
- }
94
-
95
- renderInvoiceLine = (index: number) => {
96
- const amount = index === 1 ? 2 : 14, piecePrice = index === 1 ? 120 : 175, price = index === 1 ? 240 : 2450;
97
- return (
98
- <div className='invoice-line' key={index} style={this.getRowStyle()}>
99
- <span>Productnaam {index}</span>
100
- <span>{amount}</span>
101
- <span>&euro; {parsePrice(piecePrice)}</span>
102
- <span>21%</span>
103
- <span className='end'>&euro; {parsePrice(price)}</span>
104
- </div>
105
- )
106
- };
107
-
108
- renderTotals = () => {
109
- const {font} = this.state.settings;
110
- return (
111
- <>
112
- <div className='invoice-line mt bt' style={this.getRowStyle()}>
113
- <span/>
114
- <span/>
115
- <span className='light fl'>Totaal excl. BTW</span>
116
- <span/>
117
- <span className='end fl'>&euro; {'{subtotaal}'}</span>
118
- </div>
119
- <div className='invoice-line' style={this.getRowStyle()}>
120
- <span/>
121
- <span/>
122
- <span className='light fl'>BTW (21%)</span>
123
- <span/>
124
- <span className='end fl'>&euro; {'{btw_totaal}'}</span>
125
- </div>
126
- <div className='invoice-line' style={this.getRowStyle()}>
127
- <span/>
128
- <span/>
129
- <span className='underline light fl'>BTW (9%)</span>
130
- <span/>
131
- <span className='underline end fl'>&euro; {'{btw_totaal}'}</span>
132
- </div>
133
- <div className='invoice-line' style={this.getRowStyle()}>
134
- <span/>
135
- <span/>
136
- <span className='total-label fl'
137
- style={{fontWeight: font === PdfFont.HELVETICA ? 600 : 500}}>Totaalbedrag incl. BTW</span>
138
- <span/>
139
- <span className='end fl' style={{
140
- fontWeight: font === PdfFont.HELVETICA ? 600 : 500
141
- }}>&euro; {'{factuurtotaal}'}</span>
142
- </div>
143
- </>
144
- )
145
- };
146
-
147
- render = () => {
148
- const {dragging, settings} = this.state, {draggable, defaultPosition, width, height, onSaveHistory} = this.props;
149
- return (
150
- <WithEvents events={this.event}>
151
- <PDFDraggable dragging={dragging} draggable={draggable} onDragStart={this.onDragStart}
152
- alignment={settings.alignment} elementLabel='Factuurregels' onDragEnd={this.onDragEnd}
153
- position={defaultPosition} width={width} height={height} onEdit={this.onClick}
154
- onClickBar={this.onClickBar} matchParentSize
155
- forwardRef={(ref: HTMLDivElement) => {
156
- this.element = ref
157
- }} ref={(ref: PDFDraggable) => {
158
- this.draggable = ref
159
- }}
160
- onResized={onSaveHistory} onDragged={onSaveHistory}>
161
- <div className='pdf-invoice-table' onClick={this.onClick}>
162
- <div className='invoice-line' style={this.getRowStyle(true)}>
163
- <span>Productnaam</span>
164
- <span>Aantal</span>
165
- <span>Bedrag</span>
166
- <span>BTW</span>
167
- <span className='end'>Subtotaal incl. BTW</span>
168
- </div>
169
- {[1, 2].map(this.renderInvoiceLine)}
170
- {this.renderTotals()}
171
- </div>
172
- </PDFDraggable>
173
- </WithEvents>
174
- )
175
- }
176
- }
@@ -1,32 +0,0 @@
1
- /*!
2
- * Copyright (c) 2021. Dave van Rijn Development
3
- */
4
-
5
- @import '../../../../style/variables';
6
-
7
- .pdf-invoice-table {
8
- .invoice-line {
9
- padding: .75rem 0;
10
- display: grid;
11
-
12
- .amount {
13
- justify-self: center;
14
- }
15
-
16
- .end {
17
- justify-self: end;
18
- }
19
-
20
- .light {
21
- color: $color-gray-3;
22
- }
23
-
24
- .fl {
25
- white-space: nowrap;
26
- }
27
-
28
- &.bt {
29
- border-top: 2px solid #d8d8d8;
30
- }
31
- }
32
- }
@@ -1,278 +0,0 @@
1
- /*
2
- * Copyright (c) 2021. Dave van Rijn Development
3
- */
4
- import './style/pdfTemplateCreator.scss';
5
-
6
- import React, {Fragment, PureComponent} from 'react';
7
- import {
8
- AwesomeIcon, Button, DefaultPDFElementParams, directTimeout, dispatchCustomEvent, generateComponentId,
9
- IndexedObject, PDFElementParams, PDFElementPersist, PDFElementType, PdfFont, PDFSubmitHandler, PDFTextVariables,
10
- ptToPx, setElementSettings, voidFunction, generateUUID
11
- } from "../../../";
12
- import PdfText from "./text/pdfText";
13
- import classNames from 'classnames';
14
- import {PdfElement} from "./element/pdfElement";
15
- import PdfElementSettings from "./settings/pdfElementSettings";
16
- import PdfImage from "./image/pdfImage";
17
- import PdfInvoiceTable from "./invoiceTable/pdfInvoiceTable";
18
- import {addToHistory, canRedo, canUndo, clearHistory, redo, undo} from "./history/pdfHistory";
19
-
20
- interface Props {
21
- onClickProceed?: PDFSubmitHandler;
22
- onPreview?: PDFSubmitHandler;
23
- onSubmit: PDFSubmitHandler;
24
- onChangeFont: (font: PdfFont, callback?: VoidFunction) => void;
25
- values: IndexedObject<string>;
26
- defaultItems?: DefaultPDFElementParams<any, any>[];
27
- resetItems: DefaultPDFElementParams<any, any>[];
28
- customVariables?: PDFTextVariables;
29
- id?: string;
30
- mainFont: PdfFont;
31
- disableElements: ('text' | 'image' | 'invoiceTable')[];
32
- maxWidth?: string;
33
- supportMultiPage: boolean;
34
- }
35
-
36
- interface State {
37
- elements: IndexedObject<React.ReactElement>;
38
- focusedElement: PdfElement | null;
39
- canUndo: boolean;
40
- canRedo: boolean;
41
- }
42
-
43
- export default class PDFTemplateCreator extends PureComponent<Props, State> {
44
- static defaultProps = {
45
- values: {},
46
- disableElements: [],
47
- supportMultiPage: false,
48
- };
49
-
50
- private readonly id: string = generateComponentId(this.props.id, true);
51
- private refObjects: IndexedObject<PdfElement>;
52
-
53
- state: State = {
54
- elements: {}, focusedElement: null, canRedo: false, canUndo: false,
55
- };
56
-
57
- constructor(props: Props) {
58
- super(props);
59
- this.refObjects = {};
60
- const elements: IndexedObject<React.ReactElement> = this.processItems(props.defaultItems);
61
- this.state = {elements, focusedElement: null, canRedo: false, canUndo: false};
62
- }
63
-
64
- processItems = (items?: DefaultPDFElementParams<any, any>[],
65
- convertUnits: boolean = true): IndexedObject<React.ReactElement> => {
66
- const elements: IndexedObject<React.ReactElement> = {};
67
- if (items?.length) {
68
- items = JSON.parse(JSON.stringify(items));
69
- if (items) {
70
- this.refObjects = {};
71
- for (const item of items) {
72
- setElementSettings(item, convertUnits);
73
- const id = item.key || generateUUID();
74
- elements[id] = this.getElement(id, item, convertUnits)
75
- }
76
- }
77
- }
78
- return elements;
79
- };
80
-
81
- onUndo = () => {
82
- if (canUndo()) {
83
- const {items, mainFont} = undo();
84
- if (items.length)
85
- this.props.onChangeFont(mainFont, () => {
86
- this.setState(
87
- {elements: this.processItems(items, false), canRedo: canRedo(), canUndo: canUndo()});
88
- });
89
- }
90
- };
91
-
92
- onRedo = () => {
93
- if (canRedo()) {
94
- const {items, mainFont} = redo();
95
- if (items.length)
96
- this.props.onChangeFont(mainFont, () => {
97
- this.setState(
98
- {elements: this.processItems(items, false), canRedo: canRedo(), canUndo: canUndo()});
99
- });
100
- }
101
- };
102
-
103
- onReset = () => {
104
- const {resetItems} = this.props;
105
- clearHistory();
106
- this.setState({elements: this.processItems(resetItems), canRedo: false, canUndo: false}, this.onSaveHistory);
107
- };
108
-
109
- onSaveHistory = () => {
110
- const {mainFont} = this.props, items: PDFElementParams<any, any>[] = [] =
111
- Object.values(this.refObjects).filter((element: PdfElement | null) => element !== null)
112
- .map((element: PdfElement) => element.getParams(false));
113
- addToHistory(items, mainFont);
114
- this.setState({canUndo: canUndo(), canRedo: canRedo()});
115
- };
116
-
117
- onFocusElement = (element: PdfElement) => {
118
- this.onResetElement();
119
- this.setState({focusedElement: null}, () => {
120
- this.setState({focusedElement: element});
121
- });
122
- };
123
-
124
- onResetElement = () => {
125
- this.setState({focusedElement: null});
126
- const focusedElements = document.querySelectorAll('div.pdf-draggable.focused');
127
- for (const element of focusedElements)
128
- element.classList.remove('focused');
129
- };
130
-
131
- onDeleteElement = (id: string) => () => {
132
- const {elements} = this.state;
133
- delete this.refObjects[id];
134
- delete elements[id];
135
- this.setState({elements: Object.assign({}, elements), focusedElement: null});
136
- };
137
-
138
- onAddElement = (type: PDFElementType) => (evt: React.MouseEvent) => {
139
- evt.stopPropagation();
140
- const id = generateUUID(), scrollTop = (document.documentElement.scrollTop || document.body.scrollTop) + 50,
141
- {elements} = this.state;
142
-
143
- elements[id] = this.getElement(id,
144
- {dimensions: {width: 150, height: 100, left: 50, top: scrollTop}, type});
145
- this.setState({elements: Object.assign({}, elements)});
146
- };
147
-
148
- onSubmit = () => {
149
- this.props.onSubmit(this.createSubmitItems());
150
- };
151
-
152
- onClickProceed = () => {
153
- const {onClickProceed} = this.props;
154
- if (onClickProceed)
155
- onClickProceed(this.createSubmitItems());
156
- };
157
-
158
- onPreview = () => {
159
- const {onPreview} = this.props;
160
- if (onPreview) onPreview(this.createSubmitItems());
161
- }
162
-
163
- onChangeFont = (font: PdfFont) => {
164
- const currentFont = this.props.mainFont;
165
- this.props.onChangeFont(font, this.onSaveHistory);
166
- dispatchCustomEvent('pdfFontChanged', {previousFont: currentFont, font});
167
- };
168
-
169
- createSubmitItems = (): PDFElementParams<any, any>[] => {
170
- return Object.values(this.refObjects).filter((element: PdfElement | null) => element !== null)
171
- .map((element: PdfElement) => element.getParams());
172
- };
173
-
174
- getElement = (id: string, config: DefaultPDFElementParams<any, any>,
175
- convertUnits: boolean = true): React.ReactElement => {
176
- const {dimensions, linkedID, persistent} = config, position: { x: number; y: number } = {
177
- x: convertUnits ? ptToPx(dimensions?.left || 0) : (dimensions?.left || 0),
178
- y: convertUnits ? ptToPx(dimensions?.top || 0) : (dimensions?.top || 0),
179
- }, width = dimensions?.width, height = dimensions?.height, {values, mainFont} = this.props,
180
- key: string = generateUUID();
181
- const sharedProps = {
182
- defaultPosition: position,
183
- onDelete: this.onDeleteElement(id),
184
- id,
185
- draggable: true,
186
- onFocusElement: this.onFocusElement,
187
- onSaveHistory: this.onSaveHistory,
188
- ref: (ref: any) => {
189
- this.refObjects[id] = ref;
190
- },
191
- defaultSettings: {...config.dimensions, ...config.options},
192
- key,
193
- }
194
- switch (config.type) {
195
- case PDFElementType.TEXT:
196
- return <PdfText {...sharedProps} values={values} persistent={persistent} mainFont={mainFont}
197
- linkedID={linkedID}/>;
198
- case PDFElementType.IMAGE:
199
- return <PdfImage {...sharedProps} values={values} width={width} height={height}
200
- persistent={persistent}/>;
201
- case PDFElementType.INVOICE_TABLE:
202
- return <PdfInvoiceTable {...sharedProps} width={width} height={height} mainFont={mainFont}
203
- persistent={PDFElementPersist.PERSISTENT}/>;
204
- }
205
- return <div/>;
206
- };
207
-
208
- renderElementButton = (icon: string, label: string, type: PDFElementType) => (
209
- <div className='element-button' onClick={this.onAddElement(type)}>
210
- <AwesomeIcon name={icon} className='element-icon'/>
211
- <label className='element-label'>+ {label}</label>
212
- </div>
213
- );
214
-
215
- componentDidMount = () => {
216
- directTimeout(this.onSaveHistory);
217
- };
218
-
219
- componentWillUnmount = () => {
220
- clearHistory();
221
- };
222
-
223
- render = () => {
224
- const {elements, focusedElement, canUndo, canRedo,} = this.state,
225
- {
226
- customVariables, onPreview, mainFont, disableElements, onClickProceed, maxWidth, supportMultiPage
227
- } = this.props;
228
- return (
229
- <div className='pdf-creator' onClick={this.onResetElement}
230
- style={{maxWidth: maxWidth ?? '100%'}}>
231
- <div className='footer-container'>
232
- {onPreview !== undefined ? <Button onClick={this.onPreview} label='Voorbeeld'/> : <div/>}
233
- <div>
234
- <Button onClick={this.onSubmit} label='Opslaan'/>
235
- {onClickProceed !== undefined &&
236
- <Button onClick={this.onClickProceed} label='Naar volgende stap' className='proceed-btn'/>}
237
- </div>
238
- </div>
239
- <div/>
240
- <div className='elements-container'>
241
- {!disableElements.includes('image') &&
242
- this.renderElementButton('image', 'Afbeelding', PDFElementType.IMAGE)}
243
- {!disableElements.includes('text') &&
244
- this.renderElementButton('font', 'Tekst', PDFElementType.TEXT)}
245
- {!disableElements.includes('invoiceTable') &&
246
- this.renderElementButton('list', 'Factuurregels', PDFElementType.INVOICE_TABLE)}
247
- <div className='history'>
248
- <div className={classNames('history-button', !canUndo && 'disabled')}
249
- onClick={canUndo ? this.onUndo : voidFunction}
250
- title={canUndo ? 'Ongedaan maken' : undefined}>
251
- <AwesomeIcon name='undo' className='history-icon'/>
252
- </div>
253
- <div className={classNames('history-button', !canRedo && 'disabled')}
254
- onClick={canRedo ? this.onRedo : voidFunction}
255
- title={canRedo ? 'Opnieuw doen' : undefined}>
256
- <AwesomeIcon name='redo' className='history-icon'/>
257
- </div>
258
- </div>
259
- <div className='history-reset'>
260
- <Button onClick={this.onReset} label='Reset'/>
261
- </div>
262
- </div>
263
- <div className='pdf-paper' onClick={this.onResetElement}>
264
- {Object.keys(elements).map((id: string) => (
265
- <Fragment key={id}>
266
- {elements[id]}
267
- </Fragment>
268
- ))}
269
- </div>
270
- <div className='right-col'>
271
- <PdfElementSettings element={focusedElement} onReset={this.onResetElement}
272
- customVariables={customVariables} font={mainFont}
273
- onChangeFont={this.onChangeFont} supportMultiPage={supportMultiPage}/>
274
- </div>
275
- </div>
276
- )
277
- }
278
- }
@@ -1,49 +0,0 @@
1
- /*
2
- * Copyright (c) 2021. Dave van Rijn Development
3
- */
4
- import './style/iconButton.scss';
5
-
6
- import React, {MouseEventHandler, PureComponent} from 'react';
7
- import classNames from 'classnames';
8
-
9
- export enum IconButtonType {BOLD = 'bold', ITALIC = 'italic', UNDERLINE = 'underline', CENTER = 'centered', LEFT = 'left', RIGHT = 'right'}
10
-
11
- interface Props {
12
- onClick: (type: IconButtonType) => MouseEventHandler;
13
- active: boolean;
14
- type: IconButtonType;
15
- title: string;
16
- }
17
-
18
- export default class IconButton extends PureComponent<Props> {
19
- getPath = (): string => {
20
- const {type} = this.props;
21
- switch (type) {
22
- case IconButtonType.BOLD:
23
- return 'M747 1521q74 32 140 32 376 0 376-335 0-114-41-180-27-44-61.5-74t-67.5-46.5-80.5-25-84-10.5-94.5-2q-73 0-101 10 0 53-.5 159t-.5 158q0 8-1 67.5t-.5 96.5 4.5 83.5 12 66.5zm-14-746q42 7 109 7 82 0 143-13t110-44.5 74.5-89.5 25.5-142q0-70-29-122.5t-79-82-108-43.5-124-14q-50 0-130 13 0 50 4 151t4 152q0 27-.5 80t-.5 79q0 46 1 69zm-541 889l2-94q15-4 85-16t106-27q7-12 12.5-27t8.5-33.5 5.5-32.5 3-37.5.5-34v-65.5q0-982-22-1025-4-8-22-14.5t-44.5-11-49.5-7-48.5-4.5-30.5-3l-4-83q98-2 340-11.5t373-9.5q23 0 68.5.5t67.5.5q70 0 136.5 13t128.5 42 108 71 74 104.5 28 137.5q0 52-16.5 95.5t-39 72-64.5 57.5-73 45-84 40q154 35 256.5 134t102.5 248q0 100-35 179.5t-93.5 130.5-138 85.5-163.5 48.5-176 14q-44 0-132-3t-132-3q-106 0-307 11t-231 12z';
24
- case IconButtonType.ITALIC:
25
- return 'M384 1662l17-85q6-2 81.5-21.5t111.5-37.5q28-35 41-101 1-7 62-289t114-543.5 52-296.5v-25q-24-13-54.5-18.5t-69.5-8-58-5.5l19-103q33 2 120 6.5t149.5 7 120.5 2.5q48 0 98.5-2.5t121-7 98.5-6.5q-5 39-19 89-30 10-101.5 28.5t-108.5 33.5q-8 19-14 42.5t-9 40-7.5 45.5-6.5 42q-27 148-87.5 419.5t-77.5 355.5q-2 9-13 58t-20 90-16 83.5-6 57.5l1 18q17 4 185 31-3 44-16 99-11 0-32.5 1.5t-32.5 1.5q-29 0-87-10t-86-10q-138-2-206-2-51 0-143 9t-121 11z';
26
- case IconButtonType.UNDERLINE:
27
- return 'M176 223q-37-2-45-4l-3-88q13-1 40-1 60 0 112 4 132 7 166 7 86 0 168-3 116-4 146-5 56 0 86-2l-1 14 2 64v9q-60 9-124 9-60 0-79 25-13 14-13 132 0 13 .5 32.5t.5 25.5l1 229 14 280q6 124 51 202 35 59 96 92 88 47 177 47 104 0 191-28 56-18 99-51 48-36 65-64 36-56 53-114 21-73 21-229 0-79-3.5-128t-11-122.5-13.5-159.5l-4-59q-5-67-24-88-34-35-77-34l-100 2-14-3 2-86h84l205 10q76 3 196-10l18 2q6 38 6 51 0 7-4 31-45 12-84 13-73 11-79 17-15 15-15 41 0 7 1.5 27t1.5 31q8 19 22 396 6 195-15 304-15 76-41 122-38 65-112 123-75 57-182 89-109 33-255 33-167 0-284-46-119-47-179-122-61-76-83-195-16-80-16-237v-333q0-188-17-213-25-36-147-39zm1488 1409v-64q0-14-9-23t-23-9h-1472q-14 0-23 9t-9 23v64q0 14 9 23t23 9h1472q14 0 23-9t9-23z';
28
- case IconButtonType.CENTER:
29
- return 'M1792 1344v128q0 26-19 45t-45 19h-1664q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1664q26 0 45 19t19 45zm-384-384v128q0 26-19 45t-45 19h-896q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h896q26 0 45 19t19 45zm256-384v128q0 26-19 45t-45 19h-1408q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1408q26 0 45 19t19 45zm-384-384v128q0 26-19 45t-45 19h-640q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h640q26 0 45 19t19 45z';
30
- case IconButtonType.LEFT:
31
- return 'M1792 1344v128q0 26-19 45t-45 19h-1664q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1664q26 0 45 19t19 45zm-384-384v128q0 26-19 45t-45 19h-1280q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1280q26 0 45 19t19 45zm256-384v128q0 26-19 45t-45 19h-1536q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1536q26 0 45 19t19 45zm-384-384v128q0 26-19 45t-45 19h-1152q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1152q26 0 45 19t19 45z';
32
- case IconButtonType.RIGHT:
33
- return 'M1792 1344v128q0 26-19 45t-45 19h-1664q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1664q26 0 45 19t19 45zm-384-384v128q0 26-19 45t-45 19h-1280q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1280q26 0 45 19t19 45zm256-384v128q0 26-19 45t-45 19h-1536q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1536q26 0 45 19t19 45zm-384-384v128q0 26-19 45t-45 19h-1152q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1152q26 0 45 19t19 45z';
34
- }
35
- }
36
-
37
- render = () => {
38
- const {onClick, active, type, title} = this.props;
39
- return (
40
- <div className={classNames('icon-button', active && 'active')} onClick={onClick(type)} title={title}>
41
- <span className='icon-container'>
42
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1792 1792" className="button-icon">
43
- <path d={this.getPath()}/>
44
- </svg>
45
- </span>
46
- </div>
47
- )
48
- }
49
- }
@@ -1,50 +0,0 @@
1
- /*!
2
- * Copyright (c) 2021. Dave van Rijn Development
3
- */
4
-
5
- @import '../../../../../style/variables';
6
-
7
- .icon-button {
8
- display: inline-flex;
9
- text-align: center;
10
- justify-content: center;
11
- align-items: center;
12
- cursor: pointer;
13
- background-color: $color-gray-7;
14
- width: 34px;
15
- height: 34px;
16
- transition: background-color .2s ease-in-out;
17
- border-right: 1px solid $color-gray-4;
18
-
19
- .icon-container {
20
- display: inline-flex;
21
- text-align: center;
22
- justify-content: center;
23
- align-items: center;
24
-
25
- .button-icon {
26
- pointer-events: none;
27
- width: 14px;
28
- height: 14px;
29
- isolation: isolate;
30
- overflow: hidden;
31
- stroke: #4c4c4c;
32
- fill: #4c4c4c;
33
- transform-origin: 0 0 !important;
34
- background: 50% no-repeat;
35
- background-size: contain;
36
- }
37
- }
38
-
39
- &:hover {
40
- background-color: $color-gray-4;
41
- }
42
-
43
- &.active {
44
- background-color: $color-blue-1;
45
- }
46
-
47
- &:last-child {
48
- border-right: none;
49
- }
50
- }
@@ -1,82 +0,0 @@
1
- /*
2
- * Copyright (c) 2021. Dave van Rijn Development
3
- */
4
- import './style/pdfImageSettings.scss';
5
-
6
- import React, {PureComponent} from 'react';
7
- import PdfImage from "../../image/pdfImage";
8
- import {Button, DvrdSelect, ElementPosition, SelectItemShape} from "../../../../../index";
9
- import IconButton, {IconButtonType} from "../buttons/iconButton";
10
- import {PDFDisplay} from "../../../util/interfaces";
11
-
12
- interface Props {
13
- element: PdfImage;
14
- supportMultiPage: boolean;
15
- }
16
-
17
- interface State {
18
- alignment?: ElementPosition;
19
- display: PDFDisplay;
20
- }
21
-
22
- const displayItems: SelectItemShape[] = [
23
- {value: PDFDisplay.ALL_PAGES, label: 'Alle pagina\'s'},
24
- {value: PDFDisplay.FIRST_PAGE, label: 'Alleen eerste pagina'},
25
- {value: PDFDisplay.LAST_PAGE, label: 'Alleen laatste pagina'},
26
- ]
27
-
28
- export default class PdfImageSettings extends PureComponent<Props, State> {
29
- constructor(props: Props) {
30
- super(props);
31
- const settings = props.element.getSettings();
32
- this.state = {
33
- alignment: settings.alignment,
34
- display: settings.display ?? PDFDisplay.ALL_PAGES,
35
- };
36
- }
37
-
38
- onChangeDisplay = (value: PDFDisplay) => {
39
- const {element} = this.props;
40
- element.setSetting('display', value, () => {
41
- this.setState({display: value});
42
- })
43
- }
44
-
45
- onToggleAlignment = (type: IconButtonType) => () => {
46
- const {alignment} = this.state, {element} = this.props;
47
- let nextAlignment: ElementPosition | undefined;
48
- if (type === IconButtonType.LEFT)
49
- nextAlignment = alignment === ElementPosition.LEFT ? undefined : ElementPosition.LEFT;
50
- else if (type === IconButtonType.CENTER)
51
- nextAlignment = alignment === ElementPosition.CENTER ? undefined : ElementPosition.CENTER;
52
- else if (type === IconButtonType.RIGHT)
53
- nextAlignment = alignment === ElementPosition.RIGHT ? undefined : ElementPosition.RIGHT;
54
- element.setSetting('alignment', nextAlignment, () => {
55
- this.setState({alignment: nextAlignment});
56
- });
57
- }
58
-
59
- render = () => {
60
- const {element, supportMultiPage} = this.props, {alignment, display} = this.state;
61
- return (
62
- <div className='pdf-image-settings'>
63
- {supportMultiPage && <>
64
- <label className='settings-title'>Pagina's</label>
65
- <DvrdSelect onChange={this.onChangeDisplay} value={display} items={displayItems}/>
66
- </>}
67
- <div className='divider'/>
68
- <label className='settings-title'>Uitlijning</label>
69
- <div className='alignment'>
70
- <IconButton onClick={this.onToggleAlignment} active={alignment === ElementPosition.LEFT}
71
- type={IconButtonType.LEFT} title='Links'/>
72
- <IconButton onClick={this.onToggleAlignment} active={alignment === ElementPosition.CENTER}
73
- type={IconButtonType.CENTER} title='Centreren'/>
74
- <IconButton onClick={this.onToggleAlignment} active={alignment === ElementPosition.RIGHT}
75
- type={IconButtonType.RIGHT} title='Rechts'/>
76
- </div>
77
- <div className='divider'/>
78
- <Button onClick={element.onChooseFile} label='Kies afbeelding'/>
79
- </div>
80
- )
81
- }
82
- }
@@ -1,9 +0,0 @@
1
- /*!
2
- * Copyright (c) 2021. Dave van Rijn Development
3
- */
4
-
5
- @import '../../../../../style/variables';
6
-
7
- .pdf-image-settings {
8
-
9
- }