@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.
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
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.HEX_COLOR_PATTERN = exports.DEFAULT_OPACITY = void 0;
4
4
  exports.DEFAULT_OPACITY = 1;
5
- exports.HEX_COLOR_PATTERN = '^#(?:[A-Fa-f0-9]{3,4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$';
5
+ exports.HEX_COLOR_PATTERN = '^#(?:[A-Fa-f0-9]{6})$';
6
6
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG,CAAC,CAAC;AACpB,QAAA,iBAAiB,GAAG,uDAAuD,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG,CAAC,CAAC;AACpB,QAAA,iBAAiB,GAAG,uBAAuB,CAAC"}
@@ -26,21 +26,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.rotatePoint = exports.convertForPdfLayoutProps = exports.builtInPlugins = exports.ellipse = exports.rectangle = exports.getDynamicHeightForTable = exports.modifyTemplateForTable = exports.tableBeta = exports.line = exports.barcodes = exports.readOnlySvg = exports.svg = exports.readOnlyImage = exports.image = exports.readOnlyText = exports.text = void 0;
30
- const index_js_1 = __importStar(require("./text/index.js"));
31
- exports.text = index_js_1.default;
32
- Object.defineProperty(exports, "readOnlyText", { enumerable: true, get: function () { return index_js_1.readOnlyText; } });
29
+ exports.rotatePoint = exports.convertForPdfLayoutProps = exports.builtInPlugins = exports.ellipse = exports.rectangle = exports.getDynamicHeightForTable = exports.modifyTemplateForTable = exports.tableBeta = exports.line = exports.barcodes = exports.readOnlySvg = exports.svg = exports.readOnlyImage = exports.image = exports.readOnlyText = exports.text = exports.multiVariableText = void 0;
30
+ const index_js_1 = __importDefault(require("./multiVariableText/index.js"));
31
+ exports.multiVariableText = index_js_1.default;
32
+ const index_js_2 = __importStar(require("./text/index.js"));
33
+ exports.text = index_js_2.default;
34
+ Object.defineProperty(exports, "readOnlyText", { enumerable: true, get: function () { return index_js_2.readOnlyText; } });
33
35
  const image_js_1 = __importStar(require("./graphics/image.js"));
34
36
  exports.image = image_js_1.default;
35
37
  Object.defineProperty(exports, "readOnlyImage", { enumerable: true, get: function () { return image_js_1.readOnlyImage; } });
36
38
  const svg_js_1 = __importStar(require("./graphics/svg.js"));
37
39
  exports.svg = svg_js_1.default;
38
40
  Object.defineProperty(exports, "readOnlySvg", { enumerable: true, get: function () { return svg_js_1.readOnlySvg; } });
39
- const index_js_2 = __importDefault(require("./barcodes/index.js"));
40
- exports.barcodes = index_js_2.default;
41
+ const index_js_3 = __importDefault(require("./barcodes/index.js"));
42
+ exports.barcodes = index_js_3.default;
41
43
  const line_js_1 = __importDefault(require("./shapes/line.js"));
42
44
  exports.line = line_js_1.default;
43
- const index_js_3 = __importDefault(require("./tables/index.js"));
45
+ const index_js_4 = __importDefault(require("./tables/index.js"));
44
46
  const dynamicTemplate_js_1 = require("./tables/dynamicTemplate.js");
45
47
  Object.defineProperty(exports, "modifyTemplateForTable", { enumerable: true, get: function () { return dynamicTemplate_js_1.modifyTemplateForTable; } });
46
48
  Object.defineProperty(exports, "getDynamicHeightForTable", { enumerable: true, get: function () { return dynamicTemplate_js_1.getDynamicHeightForTable; } });
@@ -50,8 +52,8 @@ Object.defineProperty(exports, "ellipse", { enumerable: true, get: function () {
50
52
  const utils_js_1 = require("./utils.js");
51
53
  Object.defineProperty(exports, "convertForPdfLayoutProps", { enumerable: true, get: function () { return utils_js_1.convertForPdfLayoutProps; } });
52
54
  Object.defineProperty(exports, "rotatePoint", { enumerable: true, get: function () { return utils_js_1.rotatePoint; } });
53
- const tableBeta = index_js_3.default;
55
+ const tableBeta = index_js_4.default;
54
56
  exports.tableBeta = tableBeta;
55
- const builtInPlugins = { Text: index_js_1.default };
57
+ const builtInPlugins = { Text: index_js_2.default };
56
58
  exports.builtInPlugins = builtInPlugins;
57
59
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4DAAqD;AAenD,eAfK,kBAAI,CAeL;AACJ,6FAhBa,uBAAY,OAgBb;AAfd,gEAA2D;AAgBzD,gBAhBK,kBAAK,CAgBL;AACL,8FAjBc,wBAAa,OAiBd;AAhBf,4DAAqD;AAiBnD,cAjBK,gBAAG,CAiBL;AACH,4FAlBY,oBAAW,OAkBZ;AAjBb,mEAA2C;AAkBzC,mBAlBK,kBAAQ,CAkBL;AAjBV,+DAAoC;AAkBlC,eAlBK,iBAAI,CAkBL;AAjBN,iEAAsC;AACtC,oEAA+F;AAkB7F,uGAlBO,2CAAsB,OAkBP;AACtB,yGAnB+B,6CAAwB,OAmB/B;AAlB1B,kEAAgE;AAmB9D,0FAnBO,6BAAS,OAmBP;AACT,wFApBkB,2BAAO,OAoBlB;AAnBT,yCAAmE;AAqBjE,yGArBO,mCAAwB,OAqBP;AACxB,4FAtBiC,sBAAW,OAsBjC;AApBb,MAAM,SAAS,GAAG,kBAAK,CAAC;AAatB,8BAAS;AAXX,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,kBAAI,EAAE,CAAC;AAgBpC,wCAAc"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4EAA4D;AAgB1D,4BAhBK,kBAAiB,CAgBL;AAfnB,4DAAqD;AAgBnD,eAhBK,kBAAI,CAgBL;AACJ,6FAjBa,uBAAY,OAiBb;AAhBd,gEAA2D;AAiBzD,gBAjBK,kBAAK,CAiBL;AACL,8FAlBc,wBAAa,OAkBd;AAjBf,4DAAqD;AAkBnD,cAlBK,gBAAG,CAkBL;AACH,4FAnBY,oBAAW,OAmBZ;AAlBb,mEAA2C;AAmBzC,mBAnBK,kBAAQ,CAmBL;AAlBV,+DAAoC;AAmBlC,eAnBK,iBAAI,CAmBL;AAlBN,iEAAsC;AACtC,oEAA+F;AAmB7F,uGAnBO,2CAAsB,OAmBP;AACtB,yGApB+B,6CAAwB,OAoB/B;AAnB1B,kEAAgE;AAoB9D,0FApBO,6BAAS,OAoBP;AACT,wFArBkB,2BAAO,OAqBlB;AApBT,yCAAmE;AAsBjE,yGAtBO,mCAAwB,OAsBP;AACxB,4FAvBiC,sBAAW,OAuBjC;AArBb,MAAM,SAAS,GAAG,kBAAK,CAAC;AActB,8BAAS;AAZX,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,kBAAI,EAAE,CAAC;AAiBpC,wCAAc"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.substituteVariables = void 0;
4
+ const substituteVariables = (text, variablesIn) => {
5
+ if (!text || !variablesIn) {
6
+ return text;
7
+ }
8
+ let substitutedText = text;
9
+ const variables = (typeof variablesIn === "string") ? JSON.parse(variablesIn) || {} : variablesIn;
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
+ return substitutedText;
17
+ };
18
+ exports.substituteVariables = substituteVariables;
19
+ //# sourceMappingURL=helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../../src/multiVariableText/helper.ts"],"names":[],"mappings":";;;AAAO,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;AAjBW,QAAA,mBAAmB,uBAiB9B"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const pdfRender_js_1 = require("./pdfRender.js");
4
+ const propPanel_js_1 = require("./propPanel.js");
5
+ const uiRender_js_1 = require("./uiRender.js");
6
+ const schema = { pdf: pdfRender_js_1.pdfRender, ui: uiRender_js_1.uiRender, propPanel: propPanel_js_1.propPanel, uninterruptedEditMode: true };
7
+ exports.default = schema;
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/multiVariableText/index.ts"],"names":[],"mappings":";;AACA,iDAA2C;AAC3C,iDAA2C;AAC3C,+CAAyC;AAGzC,MAAM,MAAM,GAAoC,EAAE,GAAG,EAAE,wBAAS,EAAE,EAAE,EAAE,sBAAQ,EAAE,SAAS,EAAT,wBAAS,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC;AACzH,kBAAe,MAAM,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pdfRender = void 0;
4
+ const pdfRender_1 = require("../text/pdfRender");
5
+ const helper_1 = require("./helper");
6
+ const pdfRender = async (arg) => {
7
+ const { value, schema, ...rest } = arg;
8
+ const renderArgs = {
9
+ value: (0, helper_1.substituteVariables)(schema.text || '', value),
10
+ schema,
11
+ ...rest,
12
+ };
13
+ await (0, pdfRender_1.pdfRender)(renderArgs);
14
+ };
15
+ exports.pdfRender = pdfRender;
16
+ //# sourceMappingURL=pdfRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfRender.js","sourceRoot":"","sources":["../../../../src/multiVariableText/pdfRender.ts"],"names":[],"mappings":";;;AAEA,iDAAiE;AACjE,qCAA+C;AAExC,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,IAAA,4BAAmB,EAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC;QACrD,MAAM;QACN,GAAG,IAAI;KACR,CAAC;IAEF,MAAM,IAAA,qBAAe,EAAC,UAAU,CAAC,CAAC;AACpC,CAAC,CAAC;AAVW,QAAA,SAAS,aAUpB"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.propPanel = void 0;
4
+ const propPanel_1 = require("../text/propPanel");
5
+ const mapDynamicVariables = (props) => {
6
+ const { rootElement, changeSchemas, activeSchema, i18n, options } = props;
7
+ const mvtSchema = activeSchema;
8
+ const text = mvtSchema.text || '';
9
+ const variables = JSON.parse(mvtSchema.content) || {};
10
+ const variablesChanged = updateVariablesFromText(text, variables);
11
+ const varNames = Object.keys(variables);
12
+ if (variablesChanged) {
13
+ changeSchemas([
14
+ { key: 'content', value: JSON.stringify(variables), schemaId: activeSchema.id },
15
+ { key: 'variables', value: varNames, schemaId: activeSchema.id }
16
+ ]);
17
+ }
18
+ const placeholderRowEl = document.getElementById('placeholder-dynamic-var')?.closest('.ant-form-item');
19
+ if (!placeholderRowEl) {
20
+ throw new Error('Failed to find Ant form placeholder row to create dynamic variables inputs.');
21
+ }
22
+ placeholderRowEl.style.display = 'none';
23
+ // The wrapping form element has a display:flex which limits the width of the form fields, removing.
24
+ rootElement.parentElement.style.display = 'block';
25
+ if (varNames.length > 0) {
26
+ for (let variableName of varNames) {
27
+ const varRow = placeholderRowEl.cloneNode(true);
28
+ const textarea = varRow.querySelector('textarea');
29
+ textarea.id = 'dynamic-var-' + variableName;
30
+ textarea.value = variables[variableName];
31
+ textarea.addEventListener('change', (e) => {
32
+ variables[variableName] = e.target.value;
33
+ changeSchemas([{ key: 'content', value: JSON.stringify(variables), schemaId: activeSchema.id }]);
34
+ });
35
+ const label = varRow.querySelector('label');
36
+ label.innerText = variableName;
37
+ varRow.style.display = 'block';
38
+ rootElement.appendChild(varRow);
39
+ }
40
+ }
41
+ else {
42
+ const para = document.createElement('p');
43
+ para.innerHTML = i18n('schemas.mvt.typingInstructions')
44
+ + ` <code style="color:${options?.theme?.token?.colorPrimary || "#168fe3"}; font-weight:bold;">{`
45
+ + i18n('schemas.mvt.sampleField')
46
+ + '}</code>';
47
+ rootElement.appendChild(para);
48
+ }
49
+ };
50
+ exports.propPanel = {
51
+ schema: (propPanelProps) => {
52
+ if (typeof propPanel_1.propPanel.schema !== 'function') {
53
+ throw Error('Oops, is text schema no longer a function?');
54
+ }
55
+ return {
56
+ ...propPanel_1.propPanel.schema(propPanelProps),
57
+ '-------': { type: 'void', widget: 'Divider' },
58
+ dynamicVarContainer: {
59
+ title: propPanelProps.i18n('schemas.mvt.variablesSampleData'),
60
+ type: 'string',
61
+ widget: 'Card',
62
+ span: 24,
63
+ properties: {
64
+ dynamicVariables: {
65
+ type: 'object',
66
+ widget: 'mapDynamicVariables',
67
+ bind: false,
68
+ span: 24
69
+ },
70
+ placeholderDynamicVar: {
71
+ title: 'Placeholder Dynamic Variable',
72
+ type: 'string',
73
+ format: 'textarea',
74
+ props: {
75
+ id: 'placeholder-dynamic-var',
76
+ autoSize: {
77
+ minRows: 2,
78
+ maxRows: 5,
79
+ },
80
+ },
81
+ span: 24,
82
+ },
83
+ }
84
+ },
85
+ };
86
+ },
87
+ widgets: { ...propPanel_1.propPanel.widgets, mapDynamicVariables },
88
+ defaultSchema: {
89
+ ...propPanel_1.propPanel.defaultSchema,
90
+ type: 'multiVariableText',
91
+ 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>',
92
+ text: 'Type something...',
93
+ content: '{}',
94
+ variables: [],
95
+ },
96
+ };
97
+ const updateVariablesFromText = (text, variables) => {
98
+ const regex = /\{([^{}]+)}/g;
99
+ const matches = text.match(regex);
100
+ let changed = false;
101
+ if (matches) {
102
+ // Add any new variables
103
+ for (const match of matches) {
104
+ const variableName = match.replace('{', '').replace('}', '');
105
+ if (!variables[variableName]) {
106
+ // NOTE: We upper case the variable name as the default value
107
+ variables[variableName] = variableName.toUpperCase();
108
+ changed = true;
109
+ }
110
+ }
111
+ // Remove any that no longer exist
112
+ Object.keys(variables).forEach((variableName) => {
113
+ if (!matches.includes('{' + variableName + '}')) {
114
+ delete variables[variableName];
115
+ changed = true;
116
+ }
117
+ });
118
+ }
119
+ else {
120
+ // No matches at all, so clear all variables
121
+ Object.keys(variables).forEach((variableName) => {
122
+ delete variables[variableName];
123
+ changed = true;
124
+ });
125
+ }
126
+ return changed;
127
+ };
128
+ //# 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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/multiVariableText/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.uiRender = void 0;
4
+ const uiRender_1 = require("../text/uiRender");
5
+ const utils_1 = require("../utils");
6
+ const helper_1 = require("./helper");
7
+ const uiRender = async (arg) => {
8
+ const { value, schema, rootElement, mode, onChange, ...rest } = arg;
9
+ let text = schema.text;
10
+ let numVariables = schema.variables.length;
11
+ if (mode === 'form' && numVariables > 0) {
12
+ await formUiRender(arg);
13
+ return;
14
+ }
15
+ await (0, uiRender_1.uiRender)({
16
+ value: (0, utils_1.isEditable)(mode, schema) ? text : (0, helper_1.substituteVariables)(text, value),
17
+ schema,
18
+ mode: mode == 'form' ? 'viewer' : mode,
19
+ rootElement,
20
+ onChange: (arg) => {
21
+ if (!Array.isArray(arg)) {
22
+ onChange && onChange({ key: 'text', value: arg.value });
23
+ }
24
+ else {
25
+ throw new Error('onChange is not an array, the parent text plugin has changed...');
26
+ }
27
+ },
28
+ ...rest,
29
+ });
30
+ const textBlock = rootElement.querySelector('#text-' + schema.id);
31
+ if (!textBlock) {
32
+ throw new Error('Text block not found. Ensure the text block has an id of "text-" + schema.id');
33
+ }
34
+ if (mode === 'designer') {
35
+ textBlock.addEventListener('keyup', (event) => {
36
+ text = textBlock.textContent || '';
37
+ if (keyPressShouldBeChecked(event)) {
38
+ const newNumVariables = countUniqueVariableNames(text);
39
+ if (numVariables !== newNumVariables) {
40
+ // If variables were modified during this keypress, we trigger a change
41
+ if (onChange) {
42
+ onChange({ key: 'text', value: text });
43
+ }
44
+ numVariables = newNumVariables;
45
+ }
46
+ }
47
+ });
48
+ }
49
+ };
50
+ exports.uiRender = uiRender;
51
+ const formUiRender = async (arg) => {
52
+ const { value, schema, rootElement, onChange, stopEditing, theme, } = arg;
53
+ const rawText = schema.text;
54
+ if (rootElement.parentElement) {
55
+ // remove the outline for the whole schema, we'll apply outlines on each individual variable field instead
56
+ rootElement.parentElement.style.outline = '';
57
+ }
58
+ const variables = JSON.parse(value) || {};
59
+ const variableIndices = getVariableIndices(rawText);
60
+ const substitutedText = (0, helper_1.substituteVariables)(rawText, variables);
61
+ const textBlock = await (0, uiRender_1.buildStyledTextContainer)(arg, substitutedText);
62
+ // Construct content-editable spans for each variable within the string
63
+ let inVarString = false;
64
+ for (let i = 0; i < rawText.length; i++) {
65
+ if (variableIndices[i]) {
66
+ inVarString = true;
67
+ let span = document.createElement('span');
68
+ span.style.outline = `${theme.colorPrimary} dashed 1px`;
69
+ (0, uiRender_1.makeElementPlainTextContentEditable)(span);
70
+ span.textContent = variables[variableIndices[i]];
71
+ span.addEventListener('blur', (e) => {
72
+ const newValue = e.target.innerText;
73
+ if (newValue !== variables[variableIndices[i]]) {
74
+ variables[variableIndices[i]] = newValue;
75
+ onChange && onChange({ key: 'content', value: JSON.stringify(variables) });
76
+ stopEditing && stopEditing();
77
+ }
78
+ });
79
+ textBlock.appendChild(span);
80
+ }
81
+ else if (inVarString) {
82
+ if (rawText[i] === '}') {
83
+ inVarString = false;
84
+ }
85
+ }
86
+ else {
87
+ let span = document.createElement('span');
88
+ span.style.letterSpacing = rawText.length === i + 1 ? '0' : 'inherit';
89
+ span.textContent = rawText[i];
90
+ textBlock.appendChild(span);
91
+ }
92
+ }
93
+ };
94
+ const getVariableIndices = (content) => {
95
+ const regex = /\{([^}]+)}/g;
96
+ const indices = [];
97
+ let match;
98
+ while ((match = regex.exec(content)) !== null) {
99
+ indices[match.index] = match[1];
100
+ }
101
+ return indices;
102
+ };
103
+ const countUniqueVariableNames = (content) => {
104
+ const regex = /\{([^}]+)}/g;
105
+ const uniqueMatchesSet = new Set();
106
+ let match;
107
+ while ((match = regex.exec(content)) !== null) {
108
+ uniqueMatchesSet.add(match[1]);
109
+ }
110
+ return uniqueMatchesSet.size;
111
+ };
112
+ /**
113
+ * An optimisation to try to minimise jank while typing.
114
+ * Only check whether variables were modified based on certain key presses.
115
+ * Regex would otherwise be performed on every key press (which isn't terrible, but this code helps).
116
+ */
117
+ const keyPressShouldBeChecked = (event) => {
118
+ if (event.key == "ArrowUp" || event.key == "ArrowDown" || event.key == "ArrowLeft" || event.key == "ArrowRight") {
119
+ return false;
120
+ }
121
+ const selection = window.getSelection();
122
+ const contenteditable = event.target;
123
+ const isCursorAtEnd = selection?.focusOffset === contenteditable?.textContent?.length;
124
+ if (isCursorAtEnd) {
125
+ return event.key === '}' || event.key === 'Backspace' || event.key === 'Delete';
126
+ }
127
+ const isCursorAtStart = selection?.anchorOffset === 0;
128
+ if (isCursorAtStart) {
129
+ return event.key === '{' || event.key === 'Backspace' || event.key === 'Delete';
130
+ }
131
+ return true;
132
+ };
133
+ //# sourceMappingURL=uiRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uiRender.js","sourceRoot":"","sources":["../../../../src/multiVariableText/uiRender.ts"],"names":[],"mappings":"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"}