@pdfme/common 4.5.2 → 5.0.0-dev.1
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/README.md +82 -11
- package/dist/cjs/__tests__/helper.test.js +213 -62
- package/dist/cjs/__tests__/helper.test.js.map +1 -1
- package/dist/cjs/src/constants.js +1 -1
- package/dist/cjs/src/helper.js +84 -53
- package/dist/cjs/src/helper.js.map +1 -1
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/cjs/src/schema.js +7 -6
- package/dist/cjs/src/schema.js.map +1 -1
- package/dist/esm/__tests__/helper.test.js +214 -63
- package/dist/esm/__tests__/helper.test.js.map +1 -1
- package/dist/esm/src/constants.js +1 -1
- package/dist/esm/src/helper.js +80 -50
- package/dist/esm/src/helper.js.map +1 -1
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/schema.js +6 -5
- package/dist/esm/src/schema.js.map +1 -1
- package/dist/types/src/constants.d.ts +1 -1
- package/dist/types/src/helper.d.ts +7 -2
- package/dist/types/src/index.d.ts +2 -2
- package/dist/types/src/schema.d.ts +293 -49
- package/dist/types/src/types.d.ts +3 -4
- package/package.json +1 -1
- package/src/constants.ts +1 -1
- package/src/helper.ts +96 -50
- package/src/index.ts +2 -0
- package/src/schema.ts +7 -5
- package/src/types.ts +4 -3
package/README.md
CHANGED
@@ -27,6 +27,7 @@
|
|
27
27
|
|
28
28
|
<p align="center">TypeScript base PDF generator and React base UI. Open source, developed by the community, and completely free to use under the MIT license!</p>
|
29
29
|
|
30
|
+
|
30
31
|
## Features
|
31
32
|
|
32
33
|
| Fast PDF Generator | Easy PDF template design | Simple JSON template |
|
@@ -70,6 +71,9 @@ npm i @pdfme/ui @pdfme/common
|
|
70
71
|
|
71
72
|
\*You must install `@pdfme/common` regardless of which package you use.
|
72
73
|
|
74
|
+
On NPM stable releases are published to the `latest` tag, and pre-releases are published to the `next` tag.
|
75
|
+
On the `dev` tag you can find releases for every commit to the `main` branch.
|
76
|
+
|
73
77
|
The following type, function and classes are available in pdfme.
|
74
78
|
|
75
79
|
`@pdfme/common`
|
@@ -117,9 +121,8 @@ The following image is a good illustration of a template.
|
|
117
121
|
**basePdf** can be given a `string`(base64), `ArrayBuffer`, or `Uint8Array`.
|
118
122
|
A blank A4 PDF can be imported with `BLANK_PDF`. You can use it to check how it works.
|
119
123
|
|
120
|
-
**
|
121
|
-
Additionally, you can create your own schemas, allowing you to render types other than the ones mentioned above.
|
122
|
-
Check detail about [Custom Schemas](https://pdfme.com/docs/custom-schemas) from here
|
124
|
+
**Schemas** can only utilize text by default, but you can load images and various barcodes like QR codes as plugins from the `@pdfme/schemas` package.
|
125
|
+
Additionally, you can create your own schemas, allowing you to render types other than the ones mentioned above. Check detail about [Custom Schemas](https://pdfme.com/docs/custom-schemas) from here.
|
123
126
|
|
124
127
|
Let's take a look at some specific data.
|
125
128
|
(If you are using TypeScript, you can import the Template type.)
|
@@ -132,26 +135,29 @@ import { Template, BLANK_PDF } from '@pdfme/common';
|
|
132
135
|
const template: Template = {
|
133
136
|
basePdf: BLANK_PDF,
|
134
137
|
schemas: [
|
135
|
-
|
136
|
-
|
138
|
+
[
|
139
|
+
{
|
140
|
+
name: 'a',
|
137
141
|
type: 'text',
|
138
142
|
position: { x: 0, y: 0 },
|
139
143
|
width: 10,
|
140
144
|
height: 10,
|
141
145
|
},
|
142
|
-
|
146
|
+
{
|
147
|
+
name: 'a',
|
143
148
|
type: 'text',
|
144
149
|
position: { x: 10, y: 10 },
|
145
150
|
width: 10,
|
146
151
|
height: 10,
|
147
152
|
},
|
148
|
-
|
153
|
+
{
|
154
|
+
name: 'c',
|
149
155
|
type: 'text',
|
150
156
|
position: { x: 20, y: 20 },
|
151
157
|
width: 10,
|
152
158
|
height: 10,
|
153
159
|
},
|
154
|
-
|
160
|
+
],
|
155
161
|
],
|
156
162
|
};
|
157
163
|
```
|
@@ -193,7 +199,7 @@ Also, each element in the inputs array corresponds to a page in the PDF, you can
|
|
193
199
|
|
194
200
|
## UI
|
195
201
|
|
196
|
-
The UI is composed of the Designer, Form, and Viewer classes.
|
202
|
+
The UI is composed of the [Designer](https://pdfme.com/docs/getting-started#designer), [Form](https://pdfme.com/docs/getting-started#form), and [Viewer](https://pdfme.com/docs/getting-started#viewer) classes.
|
197
203
|
|
198
204
|
### Designer
|
199
205
|
|
@@ -225,7 +231,6 @@ The designer instance can be manipulated with the following methods.
|
|
225
231
|
- `saveTemplate`
|
226
232
|
- `updateTemplate`
|
227
233
|
- `getTemplate`
|
228
|
-
- `getPageCursor`
|
229
234
|
- `onChangeTemplate`
|
230
235
|
- `onSaveTemplate`
|
231
236
|
- `destroy`
|
@@ -286,6 +291,72 @@ const viewer = new Viewer({ domContainer, template, inputs });
|
|
286
291
|
|
287
292
|

|
288
293
|
|
294
|
+
### Using additional schemas and custom plugins
|
295
|
+
|
296
|
+
The examples so far use only the `text` schema type. There are many others built-in within the `@pdfme/schemas` package, and you can use your own:
|
297
|
+
|
298
|
+
Here's an example using additional schemas from built-in and custom plugins:
|
299
|
+
|
300
|
+
```ts
|
301
|
+
import { Template, BLANK_PDF } from '@pdfme/common';
|
302
|
+
import { text, barcodes, image } from '@pdfme/schemas';
|
303
|
+
import myPlugin from './custom-plugins';
|
304
|
+
|
305
|
+
const template: Template = {
|
306
|
+
basePdf: BLANK_PDF,
|
307
|
+
schemas: [
|
308
|
+
[
|
309
|
+
{
|
310
|
+
name: 'example_text',
|
311
|
+
type: 'text',
|
312
|
+
position: { x: 0, y: 0 },
|
313
|
+
width: 40,
|
314
|
+
height: 10,
|
315
|
+
},
|
316
|
+
{
|
317
|
+
name: 'example_image',
|
318
|
+
type: 'image',
|
319
|
+
position: { x: 200, y: 200 },
|
320
|
+
width: 60,
|
321
|
+
height: 40,
|
322
|
+
},
|
323
|
+
{
|
324
|
+
name: 'example_qr_code',
|
325
|
+
type: 'qrcode',
|
326
|
+
position: { x: 100, y: 100 },
|
327
|
+
width: 50,
|
328
|
+
height: 50,
|
329
|
+
},
|
330
|
+
],
|
331
|
+
],
|
332
|
+
};
|
333
|
+
|
334
|
+
const plugins = {
|
335
|
+
Text: multiVariableText,
|
336
|
+
'QR Code': barcodes.qrcode,
|
337
|
+
Image: image,
|
338
|
+
MyPlugin: myPlugin
|
339
|
+
}
|
340
|
+
|
341
|
+
const inputs = [{
|
342
|
+
example_text: 'a1',
|
343
|
+
example_image: 'data:image/png;base64,iVBORw0KG....',
|
344
|
+
example_qr_code: 'https://pdfme.com/'
|
345
|
+
}];
|
346
|
+
|
347
|
+
generate({ template, inputs, plugins }).then((pdf) => {
|
348
|
+
console.log(pdf);
|
349
|
+
});
|
350
|
+
|
351
|
+
```
|
352
|
+
|
353
|
+
|
354
|
+
|
355
|
+
## Examples using pdfme
|
356
|
+
|
357
|
+
If you are looking for code examples using pdfme to get started, please check out the [pdfme-playground](https://github.com/pdfme/pdfme-playground) repository
|
358
|
+
or look at the examples in the `websit/src/pages/` folder of this repository. Settings these up is covered in the [DEVELOPMENT.md](DEVELOPMENT.md) file.
|
359
|
+
|
289
360
|
## Special Thanks
|
290
361
|
|
291
362
|
- [pdf-lib](https://pdf-lib.js.org/): Used in PDF generation.
|
@@ -297,7 +368,7 @@ const viewer = new Viewer({ domContainer, template, inputs });
|
|
297
368
|
- [react-moveable](https://daybrush.com/moveable/), [react-selecto](https://github.com/daybrush/selecto), [@scena/react-guides](https://daybrush.com/guides/): Used in Designer UI.
|
298
369
|
- [dnd-kit](https://github.com/clauderic/dnd-kit): Used in Designer UI.
|
299
370
|
|
300
|
-
|
371
|
+
I definitely could not have created pdfme without these libraries. I am grateful to the developers of these libraries.
|
301
372
|
|
302
373
|
If you want to contribute to pdfme, please check the [Development Guide](https://pdfme.com/docs/development-guide) page.
|
303
374
|
We look forward to your contribution!
|
@@ -36,8 +36,9 @@ const getSampleFont = () => ({
|
|
36
36
|
const getTemplate = () => ({
|
37
37
|
basePdf: src_1.BLANK_PDF,
|
38
38
|
schemas: [
|
39
|
-
|
40
|
-
|
39
|
+
[
|
40
|
+
{
|
41
|
+
name: 'a',
|
41
42
|
content: 'a',
|
42
43
|
type: 'text',
|
43
44
|
fontName: 'SauceHanSansJP',
|
@@ -45,14 +46,15 @@ const getTemplate = () => ({
|
|
45
46
|
width: 100,
|
46
47
|
height: 100,
|
47
48
|
},
|
48
|
-
|
49
|
+
{
|
50
|
+
name: 'b',
|
49
51
|
content: 'b',
|
50
52
|
type: 'text',
|
51
53
|
position: { x: 0, y: 0 },
|
52
54
|
width: 100,
|
53
55
|
height: 100,
|
54
56
|
},
|
55
|
-
|
57
|
+
],
|
56
58
|
],
|
57
59
|
});
|
58
60
|
describe('mm2pt test', () => {
|
@@ -101,22 +103,24 @@ describe('checkFont test', () => {
|
|
101
103
|
const _getTemplate = () => ({
|
102
104
|
basePdf: src_1.BLANK_PDF,
|
103
105
|
schemas: [
|
104
|
-
|
105
|
-
|
106
|
+
[
|
107
|
+
{
|
108
|
+
name: 'a',
|
106
109
|
content: 'a',
|
107
110
|
type: 'text',
|
108
111
|
position: { x: 0, y: 0 },
|
109
112
|
width: 100,
|
110
113
|
height: 100,
|
111
114
|
},
|
112
|
-
|
115
|
+
{
|
116
|
+
name: 'b',
|
113
117
|
content: 'b',
|
114
118
|
type: 'text',
|
115
119
|
position: { x: 0, y: 0 },
|
116
120
|
width: 100,
|
117
121
|
height: 100,
|
118
122
|
},
|
119
|
-
|
123
|
+
],
|
120
124
|
],
|
121
125
|
});
|
122
126
|
try {
|
@@ -181,8 +185,9 @@ Check this document: https://pdfme.com/docs/custom-fonts#about-font-type`);
|
|
181
185
|
const _getTemplate = () => ({
|
182
186
|
basePdf: src_1.BLANK_PDF,
|
183
187
|
schemas: [
|
184
|
-
|
185
|
-
|
188
|
+
[
|
189
|
+
{
|
190
|
+
name: 'a',
|
186
191
|
type: 'text',
|
187
192
|
content: 'a',
|
188
193
|
fontName: 'SauceHanSansJP2',
|
@@ -190,14 +195,15 @@ Check this document: https://pdfme.com/docs/custom-fonts#about-font-type`);
|
|
190
195
|
width: 100,
|
191
196
|
height: 100,
|
192
197
|
},
|
193
|
-
|
198
|
+
{
|
199
|
+
name: 'b',
|
194
200
|
type: 'text',
|
195
201
|
content: 'b',
|
196
202
|
position: { x: 0, y: 0 },
|
197
203
|
width: 100,
|
198
204
|
height: 100,
|
199
205
|
},
|
200
|
-
|
206
|
+
],
|
201
207
|
],
|
202
208
|
});
|
203
209
|
try {
|
@@ -213,8 +219,9 @@ Check this document: https://pdfme.com/docs/custom-fonts`);
|
|
213
219
|
const _getTemplate = () => ({
|
214
220
|
basePdf: src_1.BLANK_PDF,
|
215
221
|
schemas: [
|
216
|
-
|
217
|
-
|
222
|
+
[
|
223
|
+
{
|
224
|
+
name: 'a',
|
218
225
|
type: 'text',
|
219
226
|
content: 'a',
|
220
227
|
fontName: 'SauceHanSansJP2',
|
@@ -222,7 +229,8 @@ Check this document: https://pdfme.com/docs/custom-fonts`);
|
|
222
229
|
width: 100,
|
223
230
|
height: 100,
|
224
231
|
},
|
225
|
-
|
232
|
+
{
|
233
|
+
name: 'b',
|
226
234
|
type: 'text',
|
227
235
|
content: 'b',
|
228
236
|
fontName: 'SauceHanSerifJP2',
|
@@ -230,7 +238,7 @@ Check this document: https://pdfme.com/docs/custom-fonts`);
|
|
230
238
|
width: 100,
|
231
239
|
height: 100,
|
232
240
|
},
|
233
|
-
|
241
|
+
],
|
234
242
|
],
|
235
243
|
});
|
236
244
|
try {
|
@@ -299,8 +307,8 @@ describe('checkPlugins test', () => {
|
|
299
307
|
test('success test: type in Schemas(single)', () => {
|
300
308
|
try {
|
301
309
|
const template = getTemplate();
|
302
|
-
template.schemas[0].
|
303
|
-
template.schemas[0].
|
310
|
+
template.schemas[0][0].type = 'myText';
|
311
|
+
template.schemas[0][1].type = 'myText';
|
304
312
|
(0, helper_1.checkPlugins)({ template, plugins });
|
305
313
|
expect.anything();
|
306
314
|
}
|
@@ -311,8 +319,8 @@ describe('checkPlugins test', () => {
|
|
311
319
|
test('success test: type in Schemas(multiple)', () => {
|
312
320
|
try {
|
313
321
|
const template = getTemplate();
|
314
|
-
template.schemas[0].
|
315
|
-
template.schemas[0].
|
322
|
+
template.schemas[0][0].type = 'myText';
|
323
|
+
template.schemas[0][1].type = 'myImage';
|
316
324
|
(0, helper_1.checkPlugins)({ template, plugins });
|
317
325
|
expect.anything();
|
318
326
|
}
|
@@ -323,8 +331,8 @@ describe('checkPlugins test', () => {
|
|
323
331
|
test('fail test: type in Schemas not found in plugins(single)', () => {
|
324
332
|
try {
|
325
333
|
const template = getTemplate();
|
326
|
-
template.schemas[0].
|
327
|
-
template.schemas[0].
|
334
|
+
template.schemas[0][0].type = 'fail';
|
335
|
+
template.schemas[0][1].type = 'myImage';
|
328
336
|
(0, helper_1.checkPlugins)({ template, plugins });
|
329
337
|
fail();
|
330
338
|
}
|
@@ -335,8 +343,8 @@ describe('checkPlugins test', () => {
|
|
335
343
|
test('fail test: type in Schemas not found in plugins(multiple)', () => {
|
336
344
|
try {
|
337
345
|
const template = getTemplate();
|
338
|
-
template.schemas[0].
|
339
|
-
template.schemas[0].
|
346
|
+
template.schemas[0][0].type = 'fail';
|
347
|
+
template.schemas[0][1].type = 'fail2';
|
340
348
|
(0, helper_1.checkPlugins)({ template, plugins });
|
341
349
|
fail();
|
342
350
|
}
|
@@ -352,22 +360,24 @@ describe('getDynamicTemplate', () => {
|
|
352
360
|
const padding = 10;
|
353
361
|
const template = {
|
354
362
|
schemas: [
|
355
|
-
|
356
|
-
|
363
|
+
[
|
364
|
+
{
|
365
|
+
name: 'a',
|
357
366
|
content: 'a',
|
358
367
|
type: 'a',
|
359
368
|
position: { x: 10, y: aPositionY },
|
360
369
|
width: 10,
|
361
370
|
height,
|
362
371
|
},
|
363
|
-
|
372
|
+
{
|
373
|
+
name: 'b',
|
364
374
|
content: 'b',
|
365
375
|
type: 'b',
|
366
376
|
position: { x: 10, y: bPositionY },
|
367
377
|
width: 10,
|
368
378
|
height,
|
369
379
|
},
|
370
|
-
|
380
|
+
],
|
371
381
|
],
|
372
382
|
basePdf: { width: 100, height: 100, padding: [padding, padding, padding, padding] },
|
373
383
|
};
|
@@ -399,8 +409,10 @@ describe('getDynamicTemplate', () => {
|
|
399
409
|
const dynamicTemplate = await (0, helper_1.getDynamicTemplate)(createGetDynamicTemplateArg(increaseHeights));
|
400
410
|
verifyBasicStructure(dynamicTemplate);
|
401
411
|
expect(dynamicTemplate.schemas.length).toBe(1);
|
402
|
-
expect(dynamicTemplate.schemas[0].
|
403
|
-
expect(dynamicTemplate.schemas[0].
|
412
|
+
expect(dynamicTemplate.schemas[0][0].position.y).toEqual(aPositionY);
|
413
|
+
expect(dynamicTemplate.schemas[0][0].name).toEqual('a');
|
414
|
+
expect(dynamicTemplate.schemas[0][1].position.y).toEqual(increaseHeights.reduce((a, b) => a + b, 0) - height + bPositionY);
|
415
|
+
expect(dynamicTemplate.schemas[0][1].name).toEqual('b');
|
404
416
|
});
|
405
417
|
});
|
406
418
|
describe('Multiple page scenarios', () => {
|
@@ -409,19 +421,25 @@ describe('getDynamicTemplate', () => {
|
|
409
421
|
const dynamicTemplate = await (0, helper_1.getDynamicTemplate)(createGetDynamicTemplateArg(increaseHeights));
|
410
422
|
verifyBasicStructure(dynamicTemplate);
|
411
423
|
expect(dynamicTemplate.schemas.length).toBe(2);
|
412
|
-
expect(dynamicTemplate.schemas[0].
|
413
|
-
expect(dynamicTemplate.schemas[0].
|
414
|
-
expect(dynamicTemplate.schemas[1]
|
424
|
+
expect(dynamicTemplate.schemas[0][0].position.y).toEqual(aPositionY);
|
425
|
+
expect(dynamicTemplate.schemas[0][0].name).toEqual('a');
|
426
|
+
expect(dynamicTemplate.schemas[0][1]).toBeUndefined();
|
427
|
+
expect(dynamicTemplate.schemas[1][0].name).toEqual('b');
|
428
|
+
expect(dynamicTemplate.schemas[1][0].position.y).toEqual(padding);
|
429
|
+
expect(dynamicTemplate.schemas[1][1]).toBeUndefined();
|
415
430
|
});
|
416
431
|
test('should handle page break with a on page 1 and 2, b on page 2', async () => {
|
417
432
|
const increaseHeights = [20, 20, 20, 20, 20];
|
418
433
|
const dynamicTemplate = await (0, helper_1.getDynamicTemplate)(createGetDynamicTemplateArg(increaseHeights));
|
419
434
|
verifyBasicStructure(dynamicTemplate);
|
420
435
|
expect(dynamicTemplate.schemas.length).toBe(2);
|
421
|
-
expect(dynamicTemplate.schemas[0].
|
422
|
-
expect(dynamicTemplate.schemas[0].
|
423
|
-
expect(dynamicTemplate.schemas[1]
|
424
|
-
expect(dynamicTemplate.schemas[1].
|
436
|
+
expect(dynamicTemplate.schemas[0][0].position.y).toEqual(aPositionY);
|
437
|
+
expect(dynamicTemplate.schemas[0][0].name).toEqual('a');
|
438
|
+
expect(dynamicTemplate.schemas[0][1]).toBeUndefined();
|
439
|
+
expect(dynamicTemplate.schemas[1][0].position.y).toEqual(padding);
|
440
|
+
expect(dynamicTemplate.schemas[1][0].name).toEqual('a');
|
441
|
+
expect(dynamicTemplate.schemas[1][1].position.y).toEqual(increaseHeights.slice(3).reduce((a, b) => a + b, 0) - height + padding);
|
442
|
+
expect(dynamicTemplate.schemas[1][1].name).toEqual('b');
|
425
443
|
});
|
426
444
|
test('should handle multiple page breaks', async () => {
|
427
445
|
const increaseHeights = [50, 50, 50, 50, 50];
|
@@ -430,15 +448,17 @@ describe('getDynamicTemplate', () => {
|
|
430
448
|
expect(dynamicTemplate.schemas.length).toBe(5);
|
431
449
|
// Verify 'a' elements
|
432
450
|
for (let i = 0; i < 4; i++) {
|
433
|
-
expect(dynamicTemplate.schemas[i]
|
434
|
-
expect(dynamicTemplate.schemas[i].
|
435
|
-
expect(dynamicTemplate.schemas[i].
|
436
|
-
expect(dynamicTemplate.schemas[i].
|
451
|
+
expect(dynamicTemplate.schemas[i][0]).toBeDefined();
|
452
|
+
expect(dynamicTemplate.schemas[i][0].position.y).toEqual(i === 0 ? aPositionY : padding);
|
453
|
+
expect(dynamicTemplate.schemas[i][0].height).toEqual(i === 3 ? 100 : 50);
|
454
|
+
expect(dynamicTemplate.schemas[i][0].name).toEqual('a');
|
455
|
+
expect(dynamicTemplate.schemas[i][1]).toBeUndefined();
|
437
456
|
}
|
438
457
|
// Verify 'b' element
|
439
|
-
expect(dynamicTemplate.schemas[4]
|
440
|
-
expect(dynamicTemplate.schemas[4].
|
441
|
-
expect(dynamicTemplate.schemas[4].
|
458
|
+
expect(dynamicTemplate.schemas[4][0]).toBeDefined();
|
459
|
+
expect(dynamicTemplate.schemas[4][0].name).toEqual('b');
|
460
|
+
expect(dynamicTemplate.schemas[4][0].position.y).toEqual(padding);
|
461
|
+
expect(dynamicTemplate.schemas[4][0].height).toEqual(10);
|
442
462
|
});
|
443
463
|
test('should handle both a and b on next page', async () => {
|
444
464
|
const increaseHeights = [80, 10, 10];
|
@@ -446,16 +466,16 @@ describe('getDynamicTemplate', () => {
|
|
446
466
|
verifyBasicStructure(dynamicTemplate);
|
447
467
|
expect(dynamicTemplate.schemas.length).toBe(2);
|
448
468
|
// Check first page
|
449
|
-
expect(dynamicTemplate.schemas[0]
|
450
|
-
expect(dynamicTemplate.schemas[0].
|
451
|
-
expect(dynamicTemplate.schemas[0].
|
452
|
-
expect(dynamicTemplate.schemas[0]
|
469
|
+
expect(dynamicTemplate.schemas[0][0]).toBeDefined();
|
470
|
+
expect(dynamicTemplate.schemas[0][0].position.y).toEqual(aPositionY);
|
471
|
+
expect(dynamicTemplate.schemas[0][0].height).toEqual(80);
|
472
|
+
expect(dynamicTemplate.schemas[0][1]).toBeUndefined();
|
453
473
|
// Check second page
|
454
|
-
expect(dynamicTemplate.schemas[1]
|
455
|
-
expect(dynamicTemplate.schemas[1].
|
456
|
-
expect(dynamicTemplate.schemas[1].
|
457
|
-
expect(dynamicTemplate.schemas[1]
|
458
|
-
expect(dynamicTemplate.schemas[1].
|
474
|
+
expect(dynamicTemplate.schemas[1][0]).toBeDefined();
|
475
|
+
expect(dynamicTemplate.schemas[1][0].position.y).toEqual(padding);
|
476
|
+
expect(dynamicTemplate.schemas[1][0].height).toEqual(20);
|
477
|
+
expect(dynamicTemplate.schemas[1][1]).toBeDefined();
|
478
|
+
expect(dynamicTemplate.schemas[1][1].position.y).toBeGreaterThanOrEqual(dynamicTemplate.schemas[1][0].position.y + dynamicTemplate.schemas[1][0].height);
|
459
479
|
});
|
460
480
|
});
|
461
481
|
describe('Element height modifications', () => {
|
@@ -466,14 +486,15 @@ describe('getDynamicTemplate', () => {
|
|
466
486
|
verifyBasicStructure(dynamicTemplate);
|
467
487
|
expect(dynamicTemplate.schemas.length).toBe(2);
|
468
488
|
// Check 'a' element
|
469
|
-
expect(dynamicTemplate.schemas[0]
|
470
|
-
expect(dynamicTemplate.schemas[0].
|
471
|
-
expect(dynamicTemplate.schemas[0].
|
489
|
+
expect(dynamicTemplate.schemas[0][0]).toBeDefined();
|
490
|
+
expect(dynamicTemplate.schemas[0][0].position.y).toEqual(aPositionY);
|
491
|
+
expect(dynamicTemplate.schemas[0][0].height).toEqual(50);
|
492
|
+
expect(dynamicTemplate.schemas[0][0].name).toEqual('a');
|
472
493
|
// Check 'b' element
|
473
|
-
|
474
|
-
expect(
|
475
|
-
expect(
|
476
|
-
expect(
|
494
|
+
expect(dynamicTemplate.schemas[1][0]).toBeDefined();
|
495
|
+
expect(dynamicTemplate.schemas[1][0].position.y).toEqual(padding);
|
496
|
+
expect(dynamicTemplate.schemas[1][0].height).toEqual(bHeight);
|
497
|
+
expect(dynamicTemplate.schemas[1][0].name).toEqual('b');
|
477
498
|
});
|
478
499
|
});
|
479
500
|
describe('Edge cases', () => {
|
@@ -482,8 +503,9 @@ describe('getDynamicTemplate', () => {
|
|
482
503
|
const dynamicTemplate = await (0, helper_1.getDynamicTemplate)(createGetDynamicTemplateArg(increaseHeights));
|
483
504
|
verifyBasicStructure(dynamicTemplate);
|
484
505
|
expect(dynamicTemplate.schemas.length).toBe(1);
|
485
|
-
expect(dynamicTemplate.schemas[0]
|
486
|
-
expect(dynamicTemplate.schemas[0].
|
506
|
+
expect(dynamicTemplate.schemas[0][0]).toBeDefined();
|
507
|
+
expect(dynamicTemplate.schemas[0][0].name).toEqual('b');
|
508
|
+
expect(dynamicTemplate.schemas[0][1]).toBeUndefined();
|
487
509
|
});
|
488
510
|
test('should handle very large increase heights', async () => {
|
489
511
|
const increaseHeights = [1000, 1000];
|
@@ -493,4 +515,133 @@ describe('getDynamicTemplate', () => {
|
|
493
515
|
});
|
494
516
|
});
|
495
517
|
});
|
518
|
+
describe('migrateTemplate', () => {
|
519
|
+
it('should convert LegacySchemaPageArray to SchemaPageArray', () => {
|
520
|
+
const legacyTemplate = {
|
521
|
+
schemas: [
|
522
|
+
{
|
523
|
+
"field1": {
|
524
|
+
"type": "text",
|
525
|
+
"content": "Field 1",
|
526
|
+
"width": 45,
|
527
|
+
"height": 10,
|
528
|
+
"position": {
|
529
|
+
"x": 0,
|
530
|
+
"y": 0
|
531
|
+
}
|
532
|
+
},
|
533
|
+
"field2": {
|
534
|
+
"type": "text",
|
535
|
+
"content": "Field 2",
|
536
|
+
"width": 45,
|
537
|
+
"height": 10,
|
538
|
+
"position": {
|
539
|
+
"x": 0,
|
540
|
+
"y": 0
|
541
|
+
}
|
542
|
+
}
|
543
|
+
},
|
544
|
+
{
|
545
|
+
"field3": {
|
546
|
+
"type": "text",
|
547
|
+
"content": "Field 3",
|
548
|
+
"width": 45,
|
549
|
+
"height": 10,
|
550
|
+
"position": {
|
551
|
+
"x": 0,
|
552
|
+
"y": 0
|
553
|
+
}
|
554
|
+
}
|
555
|
+
}
|
556
|
+
]
|
557
|
+
};
|
558
|
+
(0, helper_1.migrateTemplate)(legacyTemplate);
|
559
|
+
const expectedSchemaPageArray = [
|
560
|
+
[
|
561
|
+
{
|
562
|
+
"name": "field1",
|
563
|
+
"type": "text",
|
564
|
+
"content": "Field 1",
|
565
|
+
"width": 45,
|
566
|
+
"height": 10,
|
567
|
+
"position": {
|
568
|
+
"x": 0,
|
569
|
+
"y": 0
|
570
|
+
}
|
571
|
+
},
|
572
|
+
{
|
573
|
+
"name": "field2",
|
574
|
+
"type": "text",
|
575
|
+
"content": "Field 2",
|
576
|
+
"width": 45,
|
577
|
+
"height": 10,
|
578
|
+
"position": {
|
579
|
+
"x": 0,
|
580
|
+
"y": 0
|
581
|
+
}
|
582
|
+
}
|
583
|
+
],
|
584
|
+
[
|
585
|
+
{
|
586
|
+
"name": "field3",
|
587
|
+
"type": "text",
|
588
|
+
"content": "Field 3",
|
589
|
+
"width": 45,
|
590
|
+
"height": 10,
|
591
|
+
"position": {
|
592
|
+
"x": 0,
|
593
|
+
"y": 0
|
594
|
+
}
|
595
|
+
}
|
596
|
+
]
|
597
|
+
];
|
598
|
+
expect(legacyTemplate.schemas).toEqual(expectedSchemaPageArray);
|
599
|
+
});
|
600
|
+
it('should not modify already SchemaPageArray', () => {
|
601
|
+
const pagedTemplate = {
|
602
|
+
schemas: [
|
603
|
+
[
|
604
|
+
{
|
605
|
+
"name": "field1",
|
606
|
+
"type": "text",
|
607
|
+
"content": "Field 1",
|
608
|
+
"width": 45,
|
609
|
+
"height": 10,
|
610
|
+
"position": {
|
611
|
+
"x": 0,
|
612
|
+
"y": 0
|
613
|
+
}
|
614
|
+
},
|
615
|
+
{
|
616
|
+
"name": "field2",
|
617
|
+
"type": "text",
|
618
|
+
"content": "Field 2",
|
619
|
+
"width": 45,
|
620
|
+
"height": 10,
|
621
|
+
"position": {
|
622
|
+
"x": 0,
|
623
|
+
"y": 0
|
624
|
+
}
|
625
|
+
}
|
626
|
+
],
|
627
|
+
[
|
628
|
+
{
|
629
|
+
"name": "field3",
|
630
|
+
"type": "text",
|
631
|
+
"content": "Field 3",
|
632
|
+
"width": 45,
|
633
|
+
"height": 10,
|
634
|
+
"position": {
|
635
|
+
"x": 0,
|
636
|
+
"y": 0
|
637
|
+
}
|
638
|
+
}
|
639
|
+
]
|
640
|
+
]
|
641
|
+
};
|
642
|
+
const before = JSON.parse(JSON.stringify(pagedTemplate));
|
643
|
+
(0, helper_1.migrateTemplate)(pagedTemplate);
|
644
|
+
expect(pagedTemplate.schemas).toEqual(before.schemas);
|
645
|
+
});
|
646
|
+
});
|
496
647
|
//# sourceMappingURL=helper.test.js.map
|