@pdfme/schemas 4.1.1 → 4.2.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
@@ -1,39 +1,90 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.uiRender = void 0;
|
3
|
+
exports.makeElementPlainTextContentEditable = exports.buildStyledTextContainer = exports.uiRender = void 0;
|
4
4
|
const common_1 = require("@pdfme/common");
|
5
5
|
const constants_js_1 = require("./constants.js");
|
6
6
|
const helper_js_1 = require("./helper.js");
|
7
7
|
const utils_js_1 = require("../utils.js");
|
8
|
-
const
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
8
|
+
const uiRender = async (arg) => {
|
9
|
+
const { value, schema, mode, onChange, stopEditing, tabIndex, placeholder, options, _cache, } = arg;
|
10
|
+
const usePlaceholder = (0, utils_js_1.isEditable)(mode, schema) && placeholder && !value;
|
11
|
+
const textBlock = await (0, exports.buildStyledTextContainer)(arg, usePlaceholder ? placeholder : value);
|
12
|
+
if (!(0, utils_js_1.isEditable)(mode, schema)) {
|
13
|
+
// Read-only mode
|
14
|
+
textBlock.innerHTML = value
|
15
|
+
.split('')
|
16
|
+
.map((l, i) => `<span style="letter-spacing:${String(value).length === i + 1 ? 0 : 'inherit'};">${l}</span>`)
|
17
|
+
.join('');
|
18
|
+
return;
|
19
|
+
}
|
20
|
+
(0, exports.makeElementPlainTextContentEditable)(textBlock);
|
21
|
+
textBlock.tabIndex = tabIndex || 0;
|
22
|
+
textBlock.innerText = value;
|
23
|
+
textBlock.addEventListener('blur', (e) => {
|
24
|
+
onChange && onChange({ key: 'content', value: e.target.innerText });
|
25
|
+
stopEditing && stopEditing();
|
26
|
+
});
|
27
|
+
if (schema.dynamicFontSize) {
|
28
|
+
let dynamicFontSize = undefined;
|
29
|
+
const font = options?.font || (0, common_1.getDefaultFont)();
|
30
|
+
const fontKitFont = await (0, helper_js_1.getFontKitFont)(schema.fontName, font, _cache);
|
31
|
+
textBlock.addEventListener('keyup', () => {
|
32
|
+
setTimeout(() => {
|
33
|
+
void (async () => {
|
34
|
+
if (!textBlock.textContent)
|
35
|
+
return;
|
36
|
+
dynamicFontSize = await (0, helper_js_1.calculateDynamicFontSize)({
|
37
|
+
textSchema: schema,
|
38
|
+
font,
|
39
|
+
value: textBlock.textContent,
|
40
|
+
startingFontSize: dynamicFontSize,
|
41
|
+
_cache,
|
42
|
+
});
|
43
|
+
textBlock.style.fontSize = `${dynamicFontSize}pt`;
|
44
|
+
const { topAdj: newTopAdj, bottomAdj: newBottomAdj } = (0, helper_js_1.getBrowserVerticalFontAdjustments)(fontKitFont, dynamicFontSize ?? schema.fontSize ?? constants_js_1.DEFAULT_FONT_SIZE, schema.lineHeight ?? constants_js_1.DEFAULT_LINE_HEIGHT, schema.verticalAlignment ?? constants_js_1.DEFAULT_VERTICAL_ALIGNMENT);
|
45
|
+
textBlock.style.paddingTop = `${newTopAdj}px`;
|
46
|
+
textBlock.style.marginBottom = `${newBottomAdj}px`;
|
47
|
+
})();
|
48
|
+
}, 0);
|
49
|
+
});
|
50
|
+
}
|
51
|
+
if (usePlaceholder) {
|
52
|
+
textBlock.style.color = constants_js_1.PLACEHOLDER_FONT_COLOR;
|
53
|
+
textBlock.addEventListener('focus', () => {
|
54
|
+
if (textBlock.innerText === placeholder) {
|
55
|
+
textBlock.innerText = '';
|
56
|
+
textBlock.style.color = schema.fontColor ?? constants_js_1.DEFAULT_FONT_COLOR;
|
57
|
+
}
|
58
|
+
});
|
59
|
+
}
|
60
|
+
if (mode === 'designer') {
|
61
|
+
setTimeout(() => {
|
62
|
+
textBlock.focus();
|
63
|
+
// Set the focus to the end of the editable element when you focus, as we would for a textarea
|
64
|
+
const selection = window.getSelection();
|
65
|
+
const range = document.createRange();
|
66
|
+
if (selection && range) {
|
67
|
+
range.selectNodeContents(textBlock);
|
68
|
+
range.collapse(false); // Collapse range to the end
|
69
|
+
selection?.removeAllRanges();
|
70
|
+
selection?.addRange(range);
|
71
|
+
}
|
72
|
+
});
|
16
73
|
}
|
17
|
-
return 'flex-start';
|
18
|
-
};
|
19
|
-
const getBackgroundColor = (value, schema) => {
|
20
|
-
if (!value || !schema.backgroundColor)
|
21
|
-
return 'transparent';
|
22
|
-
return schema.backgroundColor;
|
23
74
|
};
|
24
|
-
|
25
|
-
|
75
|
+
exports.uiRender = uiRender;
|
76
|
+
const buildStyledTextContainer = async (arg, value) => {
|
77
|
+
const { schema, rootElement, mode, options, _cache, } = arg;
|
26
78
|
const font = options?.font || (0, common_1.getDefaultFont)();
|
27
79
|
let dynamicFontSize = undefined;
|
28
|
-
const getCdfArg = (v) => ({
|
29
|
-
textSchema: schema,
|
30
|
-
font,
|
31
|
-
value: v,
|
32
|
-
startingFontSize: dynamicFontSize,
|
33
|
-
_cache,
|
34
|
-
});
|
35
80
|
if (schema.dynamicFontSize && value) {
|
36
|
-
dynamicFontSize = await (0, helper_js_1.calculateDynamicFontSize)(
|
81
|
+
dynamicFontSize = await (0, helper_js_1.calculateDynamicFontSize)({
|
82
|
+
textSchema: schema,
|
83
|
+
font,
|
84
|
+
value,
|
85
|
+
startingFontSize: dynamicFontSize,
|
86
|
+
_cache,
|
87
|
+
});
|
37
88
|
}
|
38
89
|
const fontKitFont = await (0, helper_js_1.getFontKitFont)(schema.fontName, font, _cache);
|
39
90
|
// Depending on vertical alignment, we need to move the top or bottom of the font to keep
|
@@ -83,86 +134,54 @@ const uiRender = async (arg) => {
|
|
83
134
|
textDecoration: textDecorations.join(' '),
|
84
135
|
};
|
85
136
|
const textBlock = document.createElement('div');
|
137
|
+
textBlock.id = 'text-' + schema.id;
|
86
138
|
Object.assign(textBlock.style, textBlockStyle);
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
textBlock.addEventListener('paste', (e) => {
|
100
|
-
e.preventDefault();
|
101
|
-
const paste = e.clipboardData?.getData('text');
|
102
|
-
const selection = window.getSelection();
|
103
|
-
if (!selection?.rangeCount)
|
104
|
-
return;
|
105
|
-
selection.deleteFromDocument();
|
106
|
-
selection.getRangeAt(0).insertNode(document.createTextNode(paste || ''));
|
107
|
-
selection.collapseToEnd();
|
108
|
-
});
|
109
|
-
}
|
110
|
-
textBlock.tabIndex = tabIndex || 0;
|
111
|
-
textBlock.innerText = value;
|
112
|
-
textBlock.addEventListener('blur', (e) => {
|
113
|
-
onChange && onChange({ key: 'content', value: e.target.innerText });
|
114
|
-
stopEditing && stopEditing();
|
115
|
-
});
|
116
|
-
if (schema.dynamicFontSize) {
|
117
|
-
textBlock.addEventListener('keyup', () => {
|
118
|
-
setTimeout(() => {
|
119
|
-
void (async () => {
|
120
|
-
if (!textBlock.textContent)
|
121
|
-
return;
|
122
|
-
dynamicFontSize = await (0, helper_js_1.calculateDynamicFontSize)(getCdfArg(textBlock.textContent));
|
123
|
-
textBlock.style.fontSize = `${dynamicFontSize}pt`;
|
124
|
-
const { topAdj: newTopAdj, bottomAdj: newBottomAdj } = (0, helper_js_1.getBrowserVerticalFontAdjustments)(fontKitFont, dynamicFontSize ?? schema.fontSize ?? constants_js_1.DEFAULT_FONT_SIZE, schema.lineHeight ?? constants_js_1.DEFAULT_LINE_HEIGHT, schema.verticalAlignment ?? constants_js_1.DEFAULT_VERTICAL_ALIGNMENT);
|
125
|
-
textBlock.style.paddingTop = `${newTopAdj}px`;
|
126
|
-
textBlock.style.marginBottom = `${newBottomAdj}px`;
|
127
|
-
})();
|
128
|
-
}, 0);
|
129
|
-
});
|
130
|
-
}
|
131
|
-
if (placeholder && !value) {
|
132
|
-
textBlock.innerText = placeholder;
|
133
|
-
textBlock.style.color = constants_js_1.PLACEHOLDER_FONT_COLOR;
|
134
|
-
if (schema.dynamicFontSize) {
|
135
|
-
const fontSize = await (0, helper_js_1.calculateDynamicFontSize)(getCdfArg(placeholder));
|
136
|
-
textBlock.style.fontSize = `${fontSize}pt`;
|
137
|
-
}
|
138
|
-
textBlock.addEventListener('focus', () => {
|
139
|
-
if (textBlock.innerText === placeholder) {
|
140
|
-
textBlock.innerText = '';
|
141
|
-
textBlock.style.color = schema.fontColor ?? constants_js_1.DEFAULT_FONT_COLOR;
|
142
|
-
}
|
143
|
-
});
|
144
|
-
}
|
145
|
-
container.appendChild(textBlock);
|
146
|
-
if (mode === 'designer') {
|
147
|
-
setTimeout(() => {
|
148
|
-
textBlock.focus();
|
149
|
-
// Set the focus to the end of the editable element when you focus, as we would for a textarea
|
150
|
-
const selection = window.getSelection();
|
151
|
-
const range = document.createRange();
|
152
|
-
range.selectNodeContents(textBlock);
|
153
|
-
range.collapse(false); // Collapse range to the end
|
154
|
-
selection?.removeAllRanges();
|
155
|
-
selection?.addRange(range);
|
156
|
-
});
|
157
|
-
}
|
139
|
+
container.appendChild(textBlock);
|
140
|
+
return textBlock;
|
141
|
+
};
|
142
|
+
exports.buildStyledTextContainer = buildStyledTextContainer;
|
143
|
+
/**
|
144
|
+
* Firefox doesn't support 'plaintext-only' contentEditable mode, which we want to avoid mark-up.
|
145
|
+
* This function adds a workaround for Firefox to make the contentEditable element behave like 'plaintext-only'.
|
146
|
+
*/
|
147
|
+
const makeElementPlainTextContentEditable = (element) => {
|
148
|
+
if (!(0, helper_js_1.isFirefox)()) {
|
149
|
+
element.contentEditable = 'plaintext-only';
|
150
|
+
return;
|
158
151
|
}
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
.
|
163
|
-
.
|
164
|
-
|
152
|
+
element.contentEditable = 'true';
|
153
|
+
element.addEventListener('keydown', (e) => {
|
154
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
155
|
+
e.preventDefault();
|
156
|
+
document.execCommand('insertLineBreak', false, undefined);
|
157
|
+
}
|
158
|
+
});
|
159
|
+
element.addEventListener('paste', (e) => {
|
160
|
+
e.preventDefault();
|
161
|
+
const paste = e.clipboardData?.getData('text');
|
162
|
+
const selection = window.getSelection();
|
163
|
+
if (!selection?.rangeCount)
|
164
|
+
return;
|
165
|
+
selection.deleteFromDocument();
|
166
|
+
selection.getRangeAt(0).insertNode(document.createTextNode(paste || ''));
|
167
|
+
selection.collapseToEnd();
|
168
|
+
});
|
169
|
+
};
|
170
|
+
exports.makeElementPlainTextContentEditable = makeElementPlainTextContentEditable;
|
171
|
+
const mapVerticalAlignToFlex = (verticalAlignmentValue) => {
|
172
|
+
switch (verticalAlignmentValue) {
|
173
|
+
case constants_js_1.VERTICAL_ALIGN_TOP:
|
174
|
+
return 'flex-start';
|
175
|
+
case constants_js_1.VERTICAL_ALIGN_MIDDLE:
|
176
|
+
return 'center';
|
177
|
+
case constants_js_1.VERTICAL_ALIGN_BOTTOM:
|
178
|
+
return 'flex-end';
|
165
179
|
}
|
180
|
+
return 'flex-start';
|
181
|
+
};
|
182
|
+
const getBackgroundColor = (value, schema) => {
|
183
|
+
if (!value || !schema.backgroundColor)
|
184
|
+
return 'transparent';
|
185
|
+
return schema.backgroundColor;
|
166
186
|
};
|
167
|
-
exports.uiRender = uiRender;
|
168
187
|
//# sourceMappingURL=uiRender.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"uiRender.js","sourceRoot":"","sources":["../../../../src/text/uiRender.ts"],"names":[],"mappings":";;;AACA,
|
1
|
+
{"version":3,"file":"uiRender.js","sourceRoot":"","sources":["../../../../src/text/uiRender.ts"],"names":[],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,uBAAuB,CAAC"}
|
package/dist/esm/src/index.js
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';
|
@@ -9,5 +10,5 @@ import { rectangle, ellipse } from './shapes/rectAndEllipse.js';
|
|
9
10
|
import { convertForPdfLayoutProps, rotatePoint } from './utils.js';
|
10
11
|
const tableBeta = table;
|
11
12
|
const builtInPlugins = { Text: text };
|
12
|
-
export { text, readOnlyText, image, readOnlyImage, svg, readOnlySvg, barcodes, line, tableBeta, modifyTemplateForTable, getDynamicHeightForTable, rectangle, ellipse, builtInPlugins, convertForPdfLayoutProps, rotatePoint, };
|
13
|
+
export { multiVariableText, text, readOnlyText, image, readOnlyImage, svg, readOnlySvg, barcodes, line, tableBeta, modifyTemplateForTable, getDynamicHeightForTable, rectangle, ellipse, builtInPlugins, convertForPdfLayoutProps, rotatePoint, };
|
13
14
|
//# sourceMappingURL=index.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,GAAG,EAAE,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,IAAI,MAAM,kBAAkB,CAAC;AACpC,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,SAAS,GAAG,KAAK,CAAC;AAExB,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAEtC,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,KAAK,EACL,aAAa,EACb,GAAG,EACH,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,sBAAsB,EACtB,wBAAwB,EACxB,SAAS,EACT,OAAO,EACP,cAAc,EACd,wBAAwB,EACxB,WAAW,GACZ,CAAC"}
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,8BAA8B,CAAA;AAC5D,OAAO,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,GAAG,EAAE,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,IAAI,MAAM,kBAAkB,CAAC;AACpC,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,SAAS,GAAG,KAAK,CAAC;AAExB,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAEtC,OAAO,EACL,iBAAiB,EACjB,IAAI,EACJ,YAAY,EACZ,KAAK,EACL,aAAa,EACb,GAAG,EACH,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,sBAAsB,EACtB,wBAAwB,EACxB,SAAS,EACT,OAAO,EACP,cAAc,EACd,wBAAwB,EACxB,WAAW,GACZ,CAAC"}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
export const substituteVariables = (text, variablesIn) => {
|
2
|
+
if (!text || !variablesIn) {
|
3
|
+
return text;
|
4
|
+
}
|
5
|
+
let substitutedText = text;
|
6
|
+
const variables = (typeof variablesIn === "string") ? JSON.parse(variablesIn) || {} : variablesIn;
|
7
|
+
Object.keys(variables).forEach((variableName) => {
|
8
|
+
// handle special characters in variable name
|
9
|
+
const variableForRegex = variableName.replace(/[/\-\\^$*+?.()|[\]{}]/g, '\\$&');
|
10
|
+
const regex = new RegExp('{' + variableForRegex + '}', 'g');
|
11
|
+
substitutedText = substitutedText.replace(regex, variables[variableName]);
|
12
|
+
});
|
13
|
+
return substitutedText;
|
14
|
+
};
|
15
|
+
//# sourceMappingURL=helper.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../../src/multiVariableText/helper.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,WAA4C,EAAU,EAAE;IACxG,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;QACzB,OAAO,IAAI,CAAC;KACb;IAED,IAAI,eAAe,GAAG,IAAI,CAAC;IAE3B,MAAM,SAAS,GAA2B,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IAE1H,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;QAC9C,6CAA6C;QAC7C,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,gBAAgB,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5D,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC"}
|
@@ -0,0 +1,6 @@
|
|
1
|
+
import { pdfRender } from './pdfRender.js';
|
2
|
+
import { propPanel } from './propPanel.js';
|
3
|
+
import { uiRender } from './uiRender.js';
|
4
|
+
const schema = { pdf: pdfRender, ui: uiRender, propPanel, uninterruptedEditMode: true };
|
5
|
+
export default schema;
|
6
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/multiVariableText/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,MAAM,MAAM,GAAoC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC;AACzH,eAAe,MAAM,CAAC"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { pdfRender as parentPdfRender } from '../text/pdfRender';
|
2
|
+
import { substituteVariables } from './helper';
|
3
|
+
export const pdfRender = async (arg) => {
|
4
|
+
const { value, schema, ...rest } = arg;
|
5
|
+
const renderArgs = {
|
6
|
+
value: substituteVariables(schema.text || '', value),
|
7
|
+
schema,
|
8
|
+
...rest,
|
9
|
+
};
|
10
|
+
await parentPdfRender(renderArgs);
|
11
|
+
};
|
12
|
+
//# sourceMappingURL=pdfRender.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"pdfRender.js","sourceRoot":"","sources":["../../../../src/multiVariableText/pdfRender.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,GAA4C,EAAE,EAAE;IAC9E,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;IAEvC,MAAM,UAAU,GAAG;QACjB,KAAK,EAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC;QACrD,MAAM;QACN,GAAG,IAAI;KACR,CAAC;IAEF,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC,CAAC"}
|
@@ -0,0 +1,125 @@
|
|
1
|
+
import { propPanel as parentPropPanel } from '../text/propPanel';
|
2
|
+
const mapDynamicVariables = (props) => {
|
3
|
+
const { rootElement, changeSchemas, activeSchema, i18n, options } = props;
|
4
|
+
const mvtSchema = activeSchema;
|
5
|
+
const text = mvtSchema.text || '';
|
6
|
+
const variables = JSON.parse(mvtSchema.content) || {};
|
7
|
+
const variablesChanged = updateVariablesFromText(text, variables);
|
8
|
+
const varNames = Object.keys(variables);
|
9
|
+
if (variablesChanged) {
|
10
|
+
changeSchemas([
|
11
|
+
{ key: 'content', value: JSON.stringify(variables), schemaId: activeSchema.id },
|
12
|
+
{ key: 'variables', value: varNames, schemaId: activeSchema.id }
|
13
|
+
]);
|
14
|
+
}
|
15
|
+
const placeholderRowEl = document.getElementById('placeholder-dynamic-var')?.closest('.ant-form-item');
|
16
|
+
if (!placeholderRowEl) {
|
17
|
+
throw new Error('Failed to find Ant form placeholder row to create dynamic variables inputs.');
|
18
|
+
}
|
19
|
+
placeholderRowEl.style.display = 'none';
|
20
|
+
// The wrapping form element has a display:flex which limits the width of the form fields, removing.
|
21
|
+
rootElement.parentElement.style.display = 'block';
|
22
|
+
if (varNames.length > 0) {
|
23
|
+
for (let variableName of varNames) {
|
24
|
+
const varRow = placeholderRowEl.cloneNode(true);
|
25
|
+
const textarea = varRow.querySelector('textarea');
|
26
|
+
textarea.id = 'dynamic-var-' + variableName;
|
27
|
+
textarea.value = variables[variableName];
|
28
|
+
textarea.addEventListener('change', (e) => {
|
29
|
+
variables[variableName] = e.target.value;
|
30
|
+
changeSchemas([{ key: 'content', value: JSON.stringify(variables), schemaId: activeSchema.id }]);
|
31
|
+
});
|
32
|
+
const label = varRow.querySelector('label');
|
33
|
+
label.innerText = variableName;
|
34
|
+
varRow.style.display = 'block';
|
35
|
+
rootElement.appendChild(varRow);
|
36
|
+
}
|
37
|
+
}
|
38
|
+
else {
|
39
|
+
const para = document.createElement('p');
|
40
|
+
para.innerHTML = i18n('schemas.mvt.typingInstructions')
|
41
|
+
+ ` <code style="color:${options?.theme?.token?.colorPrimary || "#168fe3"}; font-weight:bold;">{`
|
42
|
+
+ i18n('schemas.mvt.sampleField')
|
43
|
+
+ '}</code>';
|
44
|
+
rootElement.appendChild(para);
|
45
|
+
}
|
46
|
+
};
|
47
|
+
export const propPanel = {
|
48
|
+
schema: (propPanelProps) => {
|
49
|
+
if (typeof parentPropPanel.schema !== 'function') {
|
50
|
+
throw Error('Oops, is text schema no longer a function?');
|
51
|
+
}
|
52
|
+
return {
|
53
|
+
...parentPropPanel.schema(propPanelProps),
|
54
|
+
'-------': { type: 'void', widget: 'Divider' },
|
55
|
+
dynamicVarContainer: {
|
56
|
+
title: propPanelProps.i18n('schemas.mvt.variablesSampleData'),
|
57
|
+
type: 'string',
|
58
|
+
widget: 'Card',
|
59
|
+
span: 24,
|
60
|
+
properties: {
|
61
|
+
dynamicVariables: {
|
62
|
+
type: 'object',
|
63
|
+
widget: 'mapDynamicVariables',
|
64
|
+
bind: false,
|
65
|
+
span: 24
|
66
|
+
},
|
67
|
+
placeholderDynamicVar: {
|
68
|
+
title: 'Placeholder Dynamic Variable',
|
69
|
+
type: 'string',
|
70
|
+
format: 'textarea',
|
71
|
+
props: {
|
72
|
+
id: 'placeholder-dynamic-var',
|
73
|
+
autoSize: {
|
74
|
+
minRows: 2,
|
75
|
+
maxRows: 5,
|
76
|
+
},
|
77
|
+
},
|
78
|
+
span: 24,
|
79
|
+
},
|
80
|
+
}
|
81
|
+
},
|
82
|
+
};
|
83
|
+
},
|
84
|
+
widgets: { ...parentPropPanel.widgets, mapDynamicVariables },
|
85
|
+
defaultSchema: {
|
86
|
+
...parentPropPanel.defaultSchema,
|
87
|
+
type: 'multiVariableText',
|
88
|
+
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>',
|
89
|
+
text: 'Type something...',
|
90
|
+
content: '{}',
|
91
|
+
variables: [],
|
92
|
+
},
|
93
|
+
};
|
94
|
+
const updateVariablesFromText = (text, variables) => {
|
95
|
+
const regex = /\{([^{}]+)}/g;
|
96
|
+
const matches = text.match(regex);
|
97
|
+
let changed = false;
|
98
|
+
if (matches) {
|
99
|
+
// Add any new variables
|
100
|
+
for (const match of matches) {
|
101
|
+
const variableName = match.replace('{', '').replace('}', '');
|
102
|
+
if (!variables[variableName]) {
|
103
|
+
// NOTE: We upper case the variable name as the default value
|
104
|
+
variables[variableName] = variableName.toUpperCase();
|
105
|
+
changed = true;
|
106
|
+
}
|
107
|
+
}
|
108
|
+
// Remove any that no longer exist
|
109
|
+
Object.keys(variables).forEach((variableName) => {
|
110
|
+
if (!matches.includes('{' + variableName + '}')) {
|
111
|
+
delete variables[variableName];
|
112
|
+
changed = true;
|
113
|
+
}
|
114
|
+
});
|
115
|
+
}
|
116
|
+
else {
|
117
|
+
// No matches at all, so clear all variables
|
118
|
+
Object.keys(variables).forEach((variableName) => {
|
119
|
+
delete variables[variableName];
|
120
|
+
changed = true;
|
121
|
+
});
|
122
|
+
}
|
123
|
+
return changed;
|
124
|
+
};
|
125
|
+
//# sourceMappingURL=propPanel.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"propPanel.js","sourceRoot":"","sources":["../../../../src/multiVariableText/propPanel.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/multiVariableText/types.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,129 @@
|
|
1
|
+
import { uiRender as parentUiRender, buildStyledTextContainer, makeElementPlainTextContentEditable } from '../text/uiRender';
|
2
|
+
import { isEditable } from '../utils';
|
3
|
+
import { substituteVariables } from './helper';
|
4
|
+
export const uiRender = async (arg) => {
|
5
|
+
const { value, schema, rootElement, mode, onChange, ...rest } = arg;
|
6
|
+
let text = schema.text;
|
7
|
+
let numVariables = schema.variables.length;
|
8
|
+
if (mode === 'form' && numVariables > 0) {
|
9
|
+
await formUiRender(arg);
|
10
|
+
return;
|
11
|
+
}
|
12
|
+
await parentUiRender({
|
13
|
+
value: isEditable(mode, schema) ? text : substituteVariables(text, value),
|
14
|
+
schema,
|
15
|
+
mode: mode == 'form' ? 'viewer' : mode,
|
16
|
+
rootElement,
|
17
|
+
onChange: (arg) => {
|
18
|
+
if (!Array.isArray(arg)) {
|
19
|
+
onChange && onChange({ key: 'text', value: arg.value });
|
20
|
+
}
|
21
|
+
else {
|
22
|
+
throw new Error('onChange is not an array, the parent text plugin has changed...');
|
23
|
+
}
|
24
|
+
},
|
25
|
+
...rest,
|
26
|
+
});
|
27
|
+
const textBlock = rootElement.querySelector('#text-' + schema.id);
|
28
|
+
if (!textBlock) {
|
29
|
+
throw new Error('Text block not found. Ensure the text block has an id of "text-" + schema.id');
|
30
|
+
}
|
31
|
+
if (mode === 'designer') {
|
32
|
+
textBlock.addEventListener('keyup', (event) => {
|
33
|
+
text = textBlock.textContent || '';
|
34
|
+
if (keyPressShouldBeChecked(event)) {
|
35
|
+
const newNumVariables = countUniqueVariableNames(text);
|
36
|
+
if (numVariables !== newNumVariables) {
|
37
|
+
// If variables were modified during this keypress, we trigger a change
|
38
|
+
if (onChange) {
|
39
|
+
onChange({ key: 'text', value: text });
|
40
|
+
}
|
41
|
+
numVariables = newNumVariables;
|
42
|
+
}
|
43
|
+
}
|
44
|
+
});
|
45
|
+
}
|
46
|
+
};
|
47
|
+
const formUiRender = async (arg) => {
|
48
|
+
const { value, schema, rootElement, onChange, stopEditing, theme, } = arg;
|
49
|
+
const rawText = schema.text;
|
50
|
+
if (rootElement.parentElement) {
|
51
|
+
// remove the outline for the whole schema, we'll apply outlines on each individual variable field instead
|
52
|
+
rootElement.parentElement.style.outline = '';
|
53
|
+
}
|
54
|
+
const variables = JSON.parse(value) || {};
|
55
|
+
const variableIndices = getVariableIndices(rawText);
|
56
|
+
const substitutedText = substituteVariables(rawText, variables);
|
57
|
+
const textBlock = await buildStyledTextContainer(arg, substitutedText);
|
58
|
+
// Construct content-editable spans for each variable within the string
|
59
|
+
let inVarString = false;
|
60
|
+
for (let i = 0; i < rawText.length; i++) {
|
61
|
+
if (variableIndices[i]) {
|
62
|
+
inVarString = true;
|
63
|
+
let span = document.createElement('span');
|
64
|
+
span.style.outline = `${theme.colorPrimary} dashed 1px`;
|
65
|
+
makeElementPlainTextContentEditable(span);
|
66
|
+
span.textContent = variables[variableIndices[i]];
|
67
|
+
span.addEventListener('blur', (e) => {
|
68
|
+
const newValue = e.target.innerText;
|
69
|
+
if (newValue !== variables[variableIndices[i]]) {
|
70
|
+
variables[variableIndices[i]] = newValue;
|
71
|
+
onChange && onChange({ key: 'content', value: JSON.stringify(variables) });
|
72
|
+
stopEditing && stopEditing();
|
73
|
+
}
|
74
|
+
});
|
75
|
+
textBlock.appendChild(span);
|
76
|
+
}
|
77
|
+
else if (inVarString) {
|
78
|
+
if (rawText[i] === '}') {
|
79
|
+
inVarString = false;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
else {
|
83
|
+
let span = document.createElement('span');
|
84
|
+
span.style.letterSpacing = rawText.length === i + 1 ? '0' : 'inherit';
|
85
|
+
span.textContent = rawText[i];
|
86
|
+
textBlock.appendChild(span);
|
87
|
+
}
|
88
|
+
}
|
89
|
+
};
|
90
|
+
const getVariableIndices = (content) => {
|
91
|
+
const regex = /\{([^}]+)}/g;
|
92
|
+
const indices = [];
|
93
|
+
let match;
|
94
|
+
while ((match = regex.exec(content)) !== null) {
|
95
|
+
indices[match.index] = match[1];
|
96
|
+
}
|
97
|
+
return indices;
|
98
|
+
};
|
99
|
+
const countUniqueVariableNames = (content) => {
|
100
|
+
const regex = /\{([^}]+)}/g;
|
101
|
+
const uniqueMatchesSet = new Set();
|
102
|
+
let match;
|
103
|
+
while ((match = regex.exec(content)) !== null) {
|
104
|
+
uniqueMatchesSet.add(match[1]);
|
105
|
+
}
|
106
|
+
return uniqueMatchesSet.size;
|
107
|
+
};
|
108
|
+
/**
|
109
|
+
* An optimisation to try to minimise jank while typing.
|
110
|
+
* Only check whether variables were modified based on certain key presses.
|
111
|
+
* Regex would otherwise be performed on every key press (which isn't terrible, but this code helps).
|
112
|
+
*/
|
113
|
+
const keyPressShouldBeChecked = (event) => {
|
114
|
+
if (event.key == "ArrowUp" || event.key == "ArrowDown" || event.key == "ArrowLeft" || event.key == "ArrowRight") {
|
115
|
+
return false;
|
116
|
+
}
|
117
|
+
const selection = window.getSelection();
|
118
|
+
const contenteditable = event.target;
|
119
|
+
const isCursorAtEnd = selection?.focusOffset === contenteditable?.textContent?.length;
|
120
|
+
if (isCursorAtEnd) {
|
121
|
+
return event.key === '}' || event.key === 'Backspace' || event.key === 'Delete';
|
122
|
+
}
|
123
|
+
const isCursorAtStart = selection?.anchorOffset === 0;
|
124
|
+
if (isCursorAtStart) {
|
125
|
+
return event.key === '{' || event.key === 'Backspace' || event.key === 'Delete';
|
126
|
+
}
|
127
|
+
return true;
|
128
|
+
};
|
129
|
+
//# sourceMappingURL=uiRender.js.map
|