@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.
Files changed (56) hide show
  1. package/dist/cjs/src/constants.js +1 -1
  2. package/dist/cjs/src/constants.js.map +1 -1
  3. package/dist/cjs/src/index.js +11 -9
  4. package/dist/cjs/src/index.js.map +1 -1
  5. package/dist/cjs/src/multiVariableText/helper.js +19 -0
  6. package/dist/cjs/src/multiVariableText/helper.js.map +1 -0
  7. package/dist/cjs/src/multiVariableText/index.js +8 -0
  8. package/dist/cjs/src/multiVariableText/index.js.map +1 -0
  9. package/dist/cjs/src/multiVariableText/pdfRender.js +16 -0
  10. package/dist/cjs/src/multiVariableText/pdfRender.js.map +1 -0
  11. package/dist/cjs/src/multiVariableText/propPanel.js +128 -0
  12. package/dist/cjs/src/multiVariableText/propPanel.js.map +1 -0
  13. package/dist/cjs/src/multiVariableText/types.js +3 -0
  14. package/dist/cjs/src/multiVariableText/types.js.map +1 -0
  15. package/dist/cjs/src/multiVariableText/uiRender.js +133 -0
  16. package/dist/cjs/src/multiVariableText/uiRender.js.map +1 -0
  17. package/dist/cjs/src/text/uiRender.js +122 -103
  18. package/dist/cjs/src/text/uiRender.js.map +1 -1
  19. package/dist/esm/src/constants.js +1 -1
  20. package/dist/esm/src/constants.js.map +1 -1
  21. package/dist/esm/src/index.js +2 -1
  22. package/dist/esm/src/index.js.map +1 -1
  23. package/dist/esm/src/multiVariableText/helper.js +15 -0
  24. package/dist/esm/src/multiVariableText/helper.js.map +1 -0
  25. package/dist/esm/src/multiVariableText/index.js +6 -0
  26. package/dist/esm/src/multiVariableText/index.js.map +1 -0
  27. package/dist/esm/src/multiVariableText/pdfRender.js +12 -0
  28. package/dist/esm/src/multiVariableText/pdfRender.js.map +1 -0
  29. package/dist/esm/src/multiVariableText/propPanel.js +125 -0
  30. package/dist/esm/src/multiVariableText/propPanel.js.map +1 -0
  31. package/dist/esm/src/multiVariableText/types.js +2 -0
  32. package/dist/esm/src/multiVariableText/types.js.map +1 -0
  33. package/dist/esm/src/multiVariableText/uiRender.js +129 -0
  34. package/dist/esm/src/multiVariableText/uiRender.js.map +1 -0
  35. package/dist/esm/src/text/uiRender.js +118 -101
  36. package/dist/esm/src/text/uiRender.js.map +1 -1
  37. package/dist/types/src/constants.d.ts +1 -1
  38. package/dist/types/src/index.d.ts +2 -1
  39. package/dist/types/src/multiVariableText/helper.d.ts +1 -0
  40. package/dist/types/src/multiVariableText/index.d.ts +4 -0
  41. package/dist/types/src/multiVariableText/pdfRender.d.ts +3 -0
  42. package/dist/types/src/multiVariableText/propPanel.d.ts +3 -0
  43. package/dist/types/src/multiVariableText/types.d.ts +5 -0
  44. package/dist/types/src/multiVariableText/uiRender.d.ts +3 -0
  45. package/dist/types/src/shapes/rectAndEllipse.d.ts +2 -0
  46. package/dist/types/src/text/uiRender.d.ts +6 -0
  47. package/package.json +1 -1
  48. package/src/constants.ts +1 -1
  49. package/src/index.ts +2 -0
  50. package/src/multiVariableText/helper.ts +18 -0
  51. package/src/multiVariableText/index.ts +8 -0
  52. package/src/multiVariableText/pdfRender.ts +16 -0
  53. package/src/multiVariableText/propPanel.ts +139 -0
  54. package/src/multiVariableText/types.ts +6 -0
  55. package/src/multiVariableText/uiRender.ts +161 -0
  56. 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 mapVerticalAlignToFlex = (verticalAlignmentValue) => {
6
- switch (verticalAlignmentValue) {
7
- case VERTICAL_ALIGN_TOP:
8
- return 'flex-start';
9
- case VERTICAL_ALIGN_MIDDLE:
10
- return 'center';
11
- case VERTICAL_ALIGN_BOTTOM:
12
- return 'flex-end';
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 uiRender = async (arg) => {
22
- const { value, schema, rootElement, mode, onChange, stopEditing, tabIndex, placeholder, options, _cache, } = arg;
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(getCdfArg(value));
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
- if (isEditable(mode, schema)) {
85
- if (!isFirefox()) {
86
- textBlock.contentEditable = 'plaintext-only';
87
- }
88
- else {
89
- textBlock.contentEditable = 'true';
90
- textBlock.addEventListener('keydown', (e) => {
91
- if (e.key === 'Enter' && !e.shiftKey) {
92
- e.preventDefault();
93
- document.execCommand('insertLineBreak', false, undefined);
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
- else {
157
- textBlock.innerHTML = value
158
- .split('')
159
- .map((l, i) => `<span style="letter-spacing:${String(value).length === i + 1 ? 0 : 'inherit'};">${l}</span>`)
160
- .join('');
161
- container.appendChild(textBlock);
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":"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"}
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]{3,4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$";
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;
@@ -0,0 +1,4 @@
1
+ import type { Plugin } from '@pdfme/common';
2
+ import type { MultiVariableTextSchema } from './types';
3
+ declare const schema: Plugin<MultiVariableTextSchema>;
4
+ export default schema;
@@ -0,0 +1,3 @@
1
+ import { PDFRenderProps } from '@pdfme/common';
2
+ import { MultiVariableTextSchema } from './types';
3
+ export declare const pdfRender: (arg: PDFRenderProps<MultiVariableTextSchema>) => Promise<void>;
@@ -0,0 +1,3 @@
1
+ import { PropPanel } from '@pdfme/common';
2
+ import { MultiVariableTextSchema } from './types';
3
+ export declare const propPanel: PropPanel<MultiVariableTextSchema>;
@@ -0,0 +1,5 @@
1
+ import type { TextSchema } from '../text/types';
2
+ export interface MultiVariableTextSchema extends TextSchema {
3
+ text: string;
4
+ variables: string[];
5
+ }
@@ -0,0 +1,3 @@
1
+ import { UIRenderProps } from '@pdfme/common';
2
+ import { MultiVariableTextSchema } from './types';
3
+ export declare const uiRender: (arg: UIRenderProps<MultiVariableTextSchema>) => Promise<void>;
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pdfme/schemas",
3
- "version": "4.1.1",
3
+ "version": "4.2.1-dev.1",
4
4
  "sideEffects": false,
5
5
  "author": "hand-dot",
6
6
  "license": "MIT",
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]{3,4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$';
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
+ }
@@ -0,0 +1,6 @@
1
+ import type { TextSchema } from '../text/types';
2
+
3
+ export interface MultiVariableTextSchema extends TextSchema {
4
+ text: string;
5
+ variables: string[];
6
+ }