@pdfme/schemas 4.1.1 → 4.2.1-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/dist/cjs/src/constants.js +1 -1
- package/dist/cjs/src/constants.js.map +1 -1
- package/dist/cjs/src/index.js +11 -9
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/cjs/src/multiVariableText/helper.js +19 -0
- package/dist/cjs/src/multiVariableText/helper.js.map +1 -0
- package/dist/cjs/src/multiVariableText/index.js +8 -0
- package/dist/cjs/src/multiVariableText/index.js.map +1 -0
- package/dist/cjs/src/multiVariableText/pdfRender.js +16 -0
- package/dist/cjs/src/multiVariableText/pdfRender.js.map +1 -0
- package/dist/cjs/src/multiVariableText/propPanel.js +128 -0
- package/dist/cjs/src/multiVariableText/propPanel.js.map +1 -0
- package/dist/cjs/src/multiVariableText/types.js +3 -0
- package/dist/cjs/src/multiVariableText/types.js.map +1 -0
- package/dist/cjs/src/multiVariableText/uiRender.js +133 -0
- package/dist/cjs/src/multiVariableText/uiRender.js.map +1 -0
- package/dist/cjs/src/text/uiRender.js +122 -103
- package/dist/cjs/src/text/uiRender.js.map +1 -1
- package/dist/esm/src/constants.js +1 -1
- package/dist/esm/src/constants.js.map +1 -1
- package/dist/esm/src/index.js +2 -1
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/multiVariableText/helper.js +15 -0
- package/dist/esm/src/multiVariableText/helper.js.map +1 -0
- package/dist/esm/src/multiVariableText/index.js +6 -0
- package/dist/esm/src/multiVariableText/index.js.map +1 -0
- package/dist/esm/src/multiVariableText/pdfRender.js +12 -0
- package/dist/esm/src/multiVariableText/pdfRender.js.map +1 -0
- package/dist/esm/src/multiVariableText/propPanel.js +125 -0
- package/dist/esm/src/multiVariableText/propPanel.js.map +1 -0
- package/dist/esm/src/multiVariableText/types.js +2 -0
- package/dist/esm/src/multiVariableText/types.js.map +1 -0
- package/dist/esm/src/multiVariableText/uiRender.js +129 -0
- package/dist/esm/src/multiVariableText/uiRender.js.map +1 -0
- package/dist/esm/src/text/uiRender.js +118 -101
- package/dist/esm/src/text/uiRender.js.map +1 -1
- package/dist/types/src/constants.d.ts +1 -1
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/multiVariableText/helper.d.ts +1 -0
- package/dist/types/src/multiVariableText/index.d.ts +4 -0
- package/dist/types/src/multiVariableText/pdfRender.d.ts +3 -0
- package/dist/types/src/multiVariableText/propPanel.d.ts +3 -0
- package/dist/types/src/multiVariableText/types.d.ts +5 -0
- package/dist/types/src/multiVariableText/uiRender.d.ts +3 -0
- package/dist/types/src/shapes/rectAndEllipse.d.ts +2 -0
- package/dist/types/src/text/uiRender.d.ts +6 -0
- package/package.json +1 -1
- package/src/constants.ts +1 -1
- package/src/index.ts +2 -0
- package/src/multiVariableText/helper.ts +18 -0
- package/src/multiVariableText/index.ts +8 -0
- package/src/multiVariableText/pdfRender.ts +16 -0
- package/src/multiVariableText/propPanel.ts +139 -0
- package/src/multiVariableText/types.ts +6 -0
- package/src/multiVariableText/uiRender.ts +161 -0
- package/src/text/uiRender.ts +150 -118
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"uiRender.js","sourceRoot":"","sources":["../../../../src/multiVariableText/uiRender.ts"],"names":[],"mappings":"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"}
|
@@ -2,35 +2,85 @@ import { getDefaultFont } from '@pdfme/common';
|
|
2
2
|
import { DEFAULT_FONT_SIZE, DEFAULT_ALIGNMENT, VERTICAL_ALIGN_TOP, VERTICAL_ALIGN_MIDDLE, VERTICAL_ALIGN_BOTTOM, DEFAULT_VERTICAL_ALIGNMENT, DEFAULT_LINE_HEIGHT, DEFAULT_CHARACTER_SPACING, DEFAULT_FONT_COLOR, PLACEHOLDER_FONT_COLOR, } from './constants.js';
|
3
3
|
import { calculateDynamicFontSize, getFontKitFont, getBrowserVerticalFontAdjustments, isFirefox, } from './helper.js';
|
4
4
|
import { isEditable } from '../utils.js';
|
5
|
-
const
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
5
|
+
export const uiRender = async (arg) => {
|
6
|
+
const { value, schema, mode, onChange, stopEditing, tabIndex, placeholder, options, _cache, } = arg;
|
7
|
+
const usePlaceholder = isEditable(mode, schema) && placeholder && !value;
|
8
|
+
const textBlock = await buildStyledTextContainer(arg, usePlaceholder ? placeholder : value);
|
9
|
+
if (!isEditable(mode, schema)) {
|
10
|
+
// Read-only mode
|
11
|
+
textBlock.innerHTML = value
|
12
|
+
.split('')
|
13
|
+
.map((l, i) => `<span style="letter-spacing:${String(value).length === i + 1 ? 0 : 'inherit'};">${l}</span>`)
|
14
|
+
.join('');
|
15
|
+
return;
|
16
|
+
}
|
17
|
+
makeElementPlainTextContentEditable(textBlock);
|
18
|
+
textBlock.tabIndex = tabIndex || 0;
|
19
|
+
textBlock.innerText = value;
|
20
|
+
textBlock.addEventListener('blur', (e) => {
|
21
|
+
onChange && onChange({ key: 'content', value: e.target.textContent });
|
22
|
+
stopEditing && stopEditing();
|
23
|
+
});
|
24
|
+
if (schema.dynamicFontSize) {
|
25
|
+
let dynamicFontSize = undefined;
|
26
|
+
const font = options?.font || getDefaultFont();
|
27
|
+
const fontKitFont = await getFontKitFont(schema.fontName, font, _cache);
|
28
|
+
textBlock.addEventListener('keyup', () => {
|
29
|
+
setTimeout(() => {
|
30
|
+
void (async () => {
|
31
|
+
if (!textBlock.textContent)
|
32
|
+
return;
|
33
|
+
dynamicFontSize = await calculateDynamicFontSize({
|
34
|
+
textSchema: schema,
|
35
|
+
font,
|
36
|
+
value: textBlock.textContent,
|
37
|
+
startingFontSize: dynamicFontSize,
|
38
|
+
_cache,
|
39
|
+
});
|
40
|
+
textBlock.style.fontSize = `${dynamicFontSize}pt`;
|
41
|
+
const { topAdj: newTopAdj, bottomAdj: newBottomAdj } = getBrowserVerticalFontAdjustments(fontKitFont, dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE, schema.lineHeight ?? DEFAULT_LINE_HEIGHT, schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT);
|
42
|
+
textBlock.style.paddingTop = `${newTopAdj}px`;
|
43
|
+
textBlock.style.marginBottom = `${newBottomAdj}px`;
|
44
|
+
})();
|
45
|
+
}, 0);
|
46
|
+
});
|
47
|
+
}
|
48
|
+
if (usePlaceholder) {
|
49
|
+
textBlock.style.color = PLACEHOLDER_FONT_COLOR;
|
50
|
+
textBlock.addEventListener('focus', () => {
|
51
|
+
if (textBlock.innerText === placeholder) {
|
52
|
+
textBlock.innerText = '';
|
53
|
+
textBlock.style.color = schema.fontColor ?? DEFAULT_FONT_COLOR;
|
54
|
+
}
|
55
|
+
});
|
56
|
+
}
|
57
|
+
if (mode === 'designer') {
|
58
|
+
setTimeout(() => {
|
59
|
+
textBlock.focus();
|
60
|
+
// Set the focus to the end of the editable element when you focus, as we would for a textarea
|
61
|
+
const selection = window.getSelection();
|
62
|
+
const range = document.createRange();
|
63
|
+
if (selection && range) {
|
64
|
+
range.selectNodeContents(textBlock);
|
65
|
+
range.collapse(false); // Collapse range to the end
|
66
|
+
selection?.removeAllRanges();
|
67
|
+
selection?.addRange(range);
|
68
|
+
}
|
69
|
+
});
|
13
70
|
}
|
14
|
-
return 'flex-start';
|
15
|
-
};
|
16
|
-
const getBackgroundColor = (value, schema) => {
|
17
|
-
if (!value || !schema.backgroundColor)
|
18
|
-
return 'transparent';
|
19
|
-
return schema.backgroundColor;
|
20
71
|
};
|
21
|
-
export const
|
22
|
-
const {
|
72
|
+
export const buildStyledTextContainer = async (arg, value) => {
|
73
|
+
const { schema, rootElement, mode, options, _cache, } = arg;
|
23
74
|
const font = options?.font || getDefaultFont();
|
24
75
|
let dynamicFontSize = undefined;
|
25
|
-
const getCdfArg = (v) => ({
|
26
|
-
textSchema: schema,
|
27
|
-
font,
|
28
|
-
value: v,
|
29
|
-
startingFontSize: dynamicFontSize,
|
30
|
-
_cache,
|
31
|
-
});
|
32
76
|
if (schema.dynamicFontSize && value) {
|
33
|
-
dynamicFontSize = await calculateDynamicFontSize(
|
77
|
+
dynamicFontSize = await calculateDynamicFontSize({
|
78
|
+
textSchema: schema,
|
79
|
+
font,
|
80
|
+
value,
|
81
|
+
startingFontSize: dynamicFontSize,
|
82
|
+
_cache,
|
83
|
+
});
|
34
84
|
}
|
35
85
|
const fontKitFont = await getFontKitFont(schema.fontName, font, _cache);
|
36
86
|
// Depending on vertical alignment, we need to move the top or bottom of the font to keep
|
@@ -80,85 +130,52 @@ export const uiRender = async (arg) => {
|
|
80
130
|
textDecoration: textDecorations.join(' '),
|
81
131
|
};
|
82
132
|
const textBlock = document.createElement('div');
|
133
|
+
textBlock.id = 'text-' + schema.id;
|
83
134
|
Object.assign(textBlock.style, textBlockStyle);
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
});
|
96
|
-
textBlock.addEventListener('paste', (e) => {
|
97
|
-
e.preventDefault();
|
98
|
-
const paste = e.clipboardData?.getData('text');
|
99
|
-
const selection = window.getSelection();
|
100
|
-
if (!selection?.rangeCount)
|
101
|
-
return;
|
102
|
-
selection.deleteFromDocument();
|
103
|
-
selection.getRangeAt(0).insertNode(document.createTextNode(paste || ''));
|
104
|
-
selection.collapseToEnd();
|
105
|
-
});
|
106
|
-
}
|
107
|
-
textBlock.tabIndex = tabIndex || 0;
|
108
|
-
textBlock.innerText = value;
|
109
|
-
textBlock.addEventListener('blur', (e) => {
|
110
|
-
onChange && onChange({ key: 'content', value: e.target.innerText });
|
111
|
-
stopEditing && stopEditing();
|
112
|
-
});
|
113
|
-
if (schema.dynamicFontSize) {
|
114
|
-
textBlock.addEventListener('keyup', () => {
|
115
|
-
setTimeout(() => {
|
116
|
-
void (async () => {
|
117
|
-
if (!textBlock.textContent)
|
118
|
-
return;
|
119
|
-
dynamicFontSize = await calculateDynamicFontSize(getCdfArg(textBlock.textContent));
|
120
|
-
textBlock.style.fontSize = `${dynamicFontSize}pt`;
|
121
|
-
const { topAdj: newTopAdj, bottomAdj: newBottomAdj } = getBrowserVerticalFontAdjustments(fontKitFont, dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE, schema.lineHeight ?? DEFAULT_LINE_HEIGHT, schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT);
|
122
|
-
textBlock.style.paddingTop = `${newTopAdj}px`;
|
123
|
-
textBlock.style.marginBottom = `${newBottomAdj}px`;
|
124
|
-
})();
|
125
|
-
}, 0);
|
126
|
-
});
|
127
|
-
}
|
128
|
-
if (placeholder && !value) {
|
129
|
-
textBlock.innerText = placeholder;
|
130
|
-
textBlock.style.color = PLACEHOLDER_FONT_COLOR;
|
131
|
-
if (schema.dynamicFontSize) {
|
132
|
-
const fontSize = await calculateDynamicFontSize(getCdfArg(placeholder));
|
133
|
-
textBlock.style.fontSize = `${fontSize}pt`;
|
134
|
-
}
|
135
|
-
textBlock.addEventListener('focus', () => {
|
136
|
-
if (textBlock.innerText === placeholder) {
|
137
|
-
textBlock.innerText = '';
|
138
|
-
textBlock.style.color = schema.fontColor ?? DEFAULT_FONT_COLOR;
|
139
|
-
}
|
140
|
-
});
|
141
|
-
}
|
142
|
-
container.appendChild(textBlock);
|
143
|
-
if (mode === 'designer') {
|
144
|
-
setTimeout(() => {
|
145
|
-
textBlock.focus();
|
146
|
-
// Set the focus to the end of the editable element when you focus, as we would for a textarea
|
147
|
-
const selection = window.getSelection();
|
148
|
-
const range = document.createRange();
|
149
|
-
range.selectNodeContents(textBlock);
|
150
|
-
range.collapse(false); // Collapse range to the end
|
151
|
-
selection?.removeAllRanges();
|
152
|
-
selection?.addRange(range);
|
153
|
-
});
|
154
|
-
}
|
135
|
+
container.appendChild(textBlock);
|
136
|
+
return textBlock;
|
137
|
+
};
|
138
|
+
/**
|
139
|
+
* Firefox doesn't support 'plaintext-only' contentEditable mode, which we want to avoid mark-up.
|
140
|
+
* This function adds a workaround for Firefox to make the contentEditable element behave like 'plaintext-only'.
|
141
|
+
*/
|
142
|
+
export const makeElementPlainTextContentEditable = (element) => {
|
143
|
+
if (!isFirefox()) {
|
144
|
+
element.contentEditable = 'plaintext-only';
|
145
|
+
return;
|
155
146
|
}
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
.
|
160
|
-
.
|
161
|
-
|
147
|
+
element.contentEditable = 'true';
|
148
|
+
element.addEventListener('keydown', (e) => {
|
149
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
150
|
+
e.preventDefault();
|
151
|
+
document.execCommand('insertLineBreak', false, undefined);
|
152
|
+
}
|
153
|
+
});
|
154
|
+
element.addEventListener('paste', (e) => {
|
155
|
+
e.preventDefault();
|
156
|
+
const paste = e.clipboardData?.getData('text');
|
157
|
+
const selection = window.getSelection();
|
158
|
+
if (!selection?.rangeCount)
|
159
|
+
return;
|
160
|
+
selection.deleteFromDocument();
|
161
|
+
selection.getRangeAt(0).insertNode(document.createTextNode(paste || ''));
|
162
|
+
selection.collapseToEnd();
|
163
|
+
});
|
164
|
+
};
|
165
|
+
const mapVerticalAlignToFlex = (verticalAlignmentValue) => {
|
166
|
+
switch (verticalAlignmentValue) {
|
167
|
+
case VERTICAL_ALIGN_TOP:
|
168
|
+
return 'flex-start';
|
169
|
+
case VERTICAL_ALIGN_MIDDLE:
|
170
|
+
return 'center';
|
171
|
+
case VERTICAL_ALIGN_BOTTOM:
|
172
|
+
return 'flex-end';
|
162
173
|
}
|
174
|
+
return 'flex-start';
|
175
|
+
};
|
176
|
+
const getBackgroundColor = (value, schema) => {
|
177
|
+
if (!value || !schema.backgroundColor)
|
178
|
+
return 'transparent';
|
179
|
+
return schema.backgroundColor;
|
163
180
|
};
|
164
181
|
//# sourceMappingURL=uiRender.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"uiRender.js","sourceRoot":"","sources":["../../../../src/text/uiRender.ts"],"names":[],"mappings":"AACA,OAAO,
|
1
|
+
{"version":3,"file":"uiRender.js","sourceRoot":"","sources":["../../../../src/text/uiRender.ts"],"names":[],"mappings":"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"}
|
@@ -1,2 +1,2 @@
|
|
1
1
|
export declare const DEFAULT_OPACITY = 1;
|
2
|
-
export declare const HEX_COLOR_PATTERN = "^#(?:[A-Fa-f0-9]{
|
2
|
+
export declare const HEX_COLOR_PATTERN = "^#(?:[A-Fa-f0-9]{6})$";
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import multiVariableText from './multiVariableText/index.js';
|
1
2
|
import text, { readOnlyText } from './text/index.js';
|
2
3
|
import image, { readOnlyImage } from './graphics/image.js';
|
3
4
|
import svg, { readOnlySvg } from './graphics/svg.js';
|
@@ -10,4 +11,4 @@ declare const tableBeta: import("@pdfme/common").Plugin<import("./tables/types.j
|
|
10
11
|
declare const builtInPlugins: {
|
11
12
|
Text: import("@pdfme/common").Plugin<import("./text/types.js").TextSchema>;
|
12
13
|
};
|
13
|
-
export { text, readOnlyText, image, readOnlyImage, svg, readOnlySvg, barcodes, line, tableBeta, modifyTemplateForTable, getDynamicHeightForTable, rectangle, ellipse, builtInPlugins, convertForPdfLayoutProps, rotatePoint, };
|
14
|
+
export { multiVariableText, text, readOnlyText, image, readOnlyImage, svg, readOnlySvg, barcodes, line, tableBeta, modifyTemplateForTable, getDynamicHeightForTable, rectangle, ellipse, builtInPlugins, convertForPdfLayoutProps, rotatePoint, };
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare const substituteVariables: (text: string, variablesIn: string | Record<string, string>) => string;
|
@@ -68,6 +68,7 @@ export declare const rectangle: {
|
|
68
68
|
};
|
69
69
|
pdf: (arg: import("@pdfme/common").PDFRenderProps<ShapeSchema>) => void | Promise<void>;
|
70
70
|
ui: (arg: import("@pdfme/common").UIRenderProps<ShapeSchema>) => void | Promise<void>;
|
71
|
+
uninterruptedEditMode?: boolean | undefined;
|
71
72
|
};
|
72
73
|
export declare const ellipse: {
|
73
74
|
propPanel: {
|
@@ -132,5 +133,6 @@ export declare const ellipse: {
|
|
132
133
|
};
|
133
134
|
pdf: (arg: import("@pdfme/common").PDFRenderProps<ShapeSchema>) => void | Promise<void>;
|
134
135
|
ui: (arg: import("@pdfme/common").UIRenderProps<ShapeSchema>) => void | Promise<void>;
|
136
|
+
uninterruptedEditMode?: boolean | undefined;
|
135
137
|
};
|
136
138
|
export {};
|
@@ -1,3 +1,9 @@
|
|
1
1
|
import { UIRenderProps } from '@pdfme/common';
|
2
2
|
import type { TextSchema } from './types';
|
3
3
|
export declare const uiRender: (arg: UIRenderProps<TextSchema>) => Promise<void>;
|
4
|
+
export declare const buildStyledTextContainer: (arg: UIRenderProps<TextSchema>, value: string) => Promise<HTMLDivElement>;
|
5
|
+
/**
|
6
|
+
* Firefox doesn't support 'plaintext-only' contentEditable mode, which we want to avoid mark-up.
|
7
|
+
* This function adds a workaround for Firefox to make the contentEditable element behave like 'plaintext-only'.
|
8
|
+
*/
|
9
|
+
export declare const makeElementPlainTextContentEditable: (element: HTMLElement) => void;
|
package/package.json
CHANGED
package/src/constants.ts
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
export const DEFAULT_OPACITY = 1;
|
2
|
-
export const HEX_COLOR_PATTERN = '^#(?:[A-Fa-f0-9]{
|
2
|
+
export const HEX_COLOR_PATTERN = '^#(?:[A-Fa-f0-9]{6})$';
|
package/src/index.ts
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
import multiVariableText from './multiVariableText/index.js'
|
1
2
|
import text, { readOnlyText } from './text/index.js';
|
2
3
|
import image, { readOnlyImage } from './graphics/image.js';
|
3
4
|
import svg, { readOnlySvg } from './graphics/svg.js';
|
@@ -13,6 +14,7 @@ const tableBeta = table;
|
|
13
14
|
const builtInPlugins = { Text: text };
|
14
15
|
|
15
16
|
export {
|
17
|
+
multiVariableText,
|
16
18
|
text,
|
17
19
|
readOnlyText,
|
18
20
|
image,
|
@@ -0,0 +1,18 @@
|
|
1
|
+
export const substituteVariables = (text: string, variablesIn: string | Record<string, string>): string => {
|
2
|
+
if (!text || !variablesIn) {
|
3
|
+
return text;
|
4
|
+
}
|
5
|
+
|
6
|
+
let substitutedText = text;
|
7
|
+
|
8
|
+
const variables: Record<string, string> = (typeof variablesIn === "string") ? JSON.parse(variablesIn) || {} : variablesIn;
|
9
|
+
|
10
|
+
Object.keys(variables).forEach((variableName) => {
|
11
|
+
// handle special characters in variable name
|
12
|
+
const variableForRegex = variableName.replace(/[/\-\\^$*+?.()|[\]{}]/g, '\\$&');
|
13
|
+
const regex = new RegExp('{' + variableForRegex + '}', 'g');
|
14
|
+
substitutedText = substitutedText.replace(regex, variables[variableName]);
|
15
|
+
});
|
16
|
+
|
17
|
+
return substitutedText;
|
18
|
+
};
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import type { Plugin } from '@pdfme/common';
|
2
|
+
import { pdfRender } from './pdfRender.js';
|
3
|
+
import { propPanel } from './propPanel.js';
|
4
|
+
import { uiRender } from './uiRender.js';
|
5
|
+
import type { MultiVariableTextSchema } from './types';
|
6
|
+
|
7
|
+
const schema: Plugin<MultiVariableTextSchema> = { pdf: pdfRender, ui: uiRender, propPanel, uninterruptedEditMode: true };
|
8
|
+
export default schema;
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import { PDFRenderProps } from '@pdfme/common';
|
2
|
+
import { MultiVariableTextSchema } from './types';
|
3
|
+
import { pdfRender as parentPdfRender } from '../text/pdfRender';
|
4
|
+
import { substituteVariables } from './helper';
|
5
|
+
|
6
|
+
export const pdfRender = async (arg: PDFRenderProps<MultiVariableTextSchema>) => {
|
7
|
+
const { value, schema, ...rest } = arg;
|
8
|
+
|
9
|
+
const renderArgs = {
|
10
|
+
value: substituteVariables(schema.text || '', value),
|
11
|
+
schema,
|
12
|
+
...rest,
|
13
|
+
};
|
14
|
+
|
15
|
+
await parentPdfRender(renderArgs);
|
16
|
+
};
|
@@ -0,0 +1,139 @@
|
|
1
|
+
import { propPanel as parentPropPanel } from '../text/propPanel';
|
2
|
+
import { PropPanel, PropPanelWidgetProps } from '@pdfme/common';
|
3
|
+
import { MultiVariableTextSchema } from './types';
|
4
|
+
|
5
|
+
const mapDynamicVariables = (props: PropPanelWidgetProps) => {
|
6
|
+
const { rootElement, changeSchemas, activeSchema, i18n, options } = props;
|
7
|
+
|
8
|
+
const mvtSchema = (activeSchema as any);
|
9
|
+
const text = mvtSchema.text || '';
|
10
|
+
const variables = JSON.parse(mvtSchema.content) || {};
|
11
|
+
const variablesChanged = updateVariablesFromText(text, variables);
|
12
|
+
const varNames = Object.keys(variables);
|
13
|
+
|
14
|
+
if (variablesChanged) {
|
15
|
+
changeSchemas([
|
16
|
+
{ key: 'content', value: JSON.stringify(variables), schemaId: activeSchema.id },
|
17
|
+
{ key: 'variables', value: varNames, schemaId: activeSchema.id }
|
18
|
+
]);
|
19
|
+
}
|
20
|
+
|
21
|
+
const placeholderRowEl = document.getElementById('placeholder-dynamic-var')?.closest('.ant-form-item') as HTMLElement;
|
22
|
+
if (!placeholderRowEl) {
|
23
|
+
throw new Error('Failed to find Ant form placeholder row to create dynamic variables inputs.');
|
24
|
+
}
|
25
|
+
placeholderRowEl.style.display = 'none';
|
26
|
+
|
27
|
+
// The wrapping form element has a display:flex which limits the width of the form fields, removing.
|
28
|
+
(rootElement.parentElement as HTMLElement).style.display = 'block';
|
29
|
+
|
30
|
+
if (varNames.length > 0) {
|
31
|
+
for (let variableName of varNames) {
|
32
|
+
const varRow = placeholderRowEl.cloneNode(true) as HTMLElement;
|
33
|
+
|
34
|
+
const textarea = varRow.querySelector('textarea') as HTMLTextAreaElement;
|
35
|
+
textarea.id = 'dynamic-var-' + variableName;
|
36
|
+
textarea.value = variables[variableName];
|
37
|
+
textarea.addEventListener('change', (e: Event) => {
|
38
|
+
variables[variableName] = (e.target as HTMLTextAreaElement).value;
|
39
|
+
changeSchemas([{ key: 'content', value: JSON.stringify(variables), schemaId: activeSchema.id }]);
|
40
|
+
});
|
41
|
+
|
42
|
+
const label = varRow.querySelector('label') as HTMLLabelElement
|
43
|
+
label.innerText = variableName;
|
44
|
+
|
45
|
+
varRow.style.display = 'block';
|
46
|
+
rootElement.appendChild(varRow);
|
47
|
+
}
|
48
|
+
} else {
|
49
|
+
const para = document.createElement('p');
|
50
|
+
para.innerHTML = i18n('schemas.mvt.typingInstructions')
|
51
|
+
+ ` <code style="color:${options?.theme?.token?.colorPrimary || "#168fe3"}; font-weight:bold;">{`
|
52
|
+
+ i18n('schemas.mvt.sampleField')
|
53
|
+
+ '}</code>';
|
54
|
+
rootElement.appendChild(para);
|
55
|
+
}
|
56
|
+
};
|
57
|
+
|
58
|
+
export const propPanel: PropPanel<MultiVariableTextSchema> = {
|
59
|
+
schema: (propPanelProps: Omit<PropPanelWidgetProps, 'rootElement'>) => {
|
60
|
+
if (typeof parentPropPanel.schema !== 'function') {
|
61
|
+
throw Error('Oops, is text schema no longer a function?');
|
62
|
+
}
|
63
|
+
return {
|
64
|
+
...parentPropPanel.schema(propPanelProps),
|
65
|
+
'-------': { type: 'void', widget: 'Divider' },
|
66
|
+
dynamicVarContainer: {
|
67
|
+
title: propPanelProps.i18n('schemas.mvt.variablesSampleData'),
|
68
|
+
type: 'string',
|
69
|
+
widget: 'Card',
|
70
|
+
span: 24,
|
71
|
+
properties: {
|
72
|
+
dynamicVariables: {
|
73
|
+
type: 'object',
|
74
|
+
widget: 'mapDynamicVariables',
|
75
|
+
bind: false,
|
76
|
+
span: 24
|
77
|
+
},
|
78
|
+
placeholderDynamicVar: {
|
79
|
+
title: 'Placeholder Dynamic Variable',
|
80
|
+
type: 'string',
|
81
|
+
format: 'textarea',
|
82
|
+
props: {
|
83
|
+
id: 'placeholder-dynamic-var',
|
84
|
+
autoSize: {
|
85
|
+
minRows: 2,
|
86
|
+
maxRows: 5,
|
87
|
+
},
|
88
|
+
},
|
89
|
+
span: 24,
|
90
|
+
},
|
91
|
+
}
|
92
|
+
},
|
93
|
+
|
94
|
+
};
|
95
|
+
},
|
96
|
+
widgets: { ...parentPropPanel.widgets, mapDynamicVariables },
|
97
|
+
defaultSchema: {
|
98
|
+
...parentPropPanel.defaultSchema,
|
99
|
+
type: 'multiVariableText',
|
100
|
+
icon: '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-type"><polyline points="4 7 4 4 20 4 20 7"/><line x1="9" x2="15" y1="20" y2="20"/><line x1="12" x2="12" y1="4" y2="20"/></svg>',
|
101
|
+
text: 'Type something...',
|
102
|
+
content: '{}',
|
103
|
+
variables: [],
|
104
|
+
},
|
105
|
+
};
|
106
|
+
|
107
|
+
|
108
|
+
const updateVariablesFromText = (text: string, variables: any): boolean => {
|
109
|
+
const regex = /\{([^{}]+)}/g;
|
110
|
+
const matches = text.match(regex);
|
111
|
+
let changed = false;
|
112
|
+
|
113
|
+
if (matches) {
|
114
|
+
// Add any new variables
|
115
|
+
for (const match of matches) {
|
116
|
+
const variableName = match.replace('{', '').replace('}', '');
|
117
|
+
if (!variables[variableName]) {
|
118
|
+
// NOTE: We upper case the variable name as the default value
|
119
|
+
variables[variableName] = variableName.toUpperCase();
|
120
|
+
changed = true;
|
121
|
+
}
|
122
|
+
}
|
123
|
+
// Remove any that no longer exist
|
124
|
+
Object.keys(variables).forEach((variableName) => {
|
125
|
+
if (!matches.includes('{' + variableName + '}')) {
|
126
|
+
delete variables[variableName];
|
127
|
+
changed = true;
|
128
|
+
}
|
129
|
+
});
|
130
|
+
} else {
|
131
|
+
// No matches at all, so clear all variables
|
132
|
+
Object.keys(variables).forEach((variableName) => {
|
133
|
+
delete variables[variableName];
|
134
|
+
changed = true;
|
135
|
+
});
|
136
|
+
}
|
137
|
+
|
138
|
+
return changed;
|
139
|
+
}
|