@report-designer/designer 0.1.0

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 (253) hide show
  1. package/dist/band-metadata.d.ts +8 -0
  2. package/dist/band-metadata.d.ts.map +1 -0
  3. package/dist/band-metadata.js +75 -0
  4. package/dist/band-metadata.js.map +1 -0
  5. package/dist/component-factory.d.ts +9 -0
  6. package/dist/component-factory.d.ts.map +1 -0
  7. package/dist/component-factory.js +141 -0
  8. package/dist/component-factory.js.map +1 -0
  9. package/dist/component-palette-model.d.ts +14 -0
  10. package/dist/component-palette-model.d.ts.map +1 -0
  11. package/dist/component-palette-model.js +21 -0
  12. package/dist/component-palette-model.js.map +1 -0
  13. package/dist/components/Canvas.d.ts +5 -0
  14. package/dist/components/Canvas.d.ts.map +1 -0
  15. package/dist/components/Canvas.js +2428 -0
  16. package/dist/components/Canvas.js.map +1 -0
  17. package/dist/components/ConditionalFormatManager.d.ts +8 -0
  18. package/dist/components/ConditionalFormatManager.d.ts.map +1 -0
  19. package/dist/components/ConditionalFormatManager.js +135 -0
  20. package/dist/components/ConditionalFormatManager.js.map +1 -0
  21. package/dist/components/Designer.d.ts +22 -0
  22. package/dist/components/Designer.d.ts.map +1 -0
  23. package/dist/components/Designer.js +115 -0
  24. package/dist/components/Designer.js.map +1 -0
  25. package/dist/components/ExpressionEditor.d.ts +10 -0
  26. package/dist/components/ExpressionEditor.d.ts.map +1 -0
  27. package/dist/components/ExpressionEditor.js +203 -0
  28. package/dist/components/ExpressionEditor.js.map +1 -0
  29. package/dist/components/LeftPanel.d.ts +11 -0
  30. package/dist/components/LeftPanel.d.ts.map +1 -0
  31. package/dist/components/LeftPanel.js +551 -0
  32. package/dist/components/LeftPanel.js.map +1 -0
  33. package/dist/components/PropertyEditor.d.ts +6 -0
  34. package/dist/components/PropertyEditor.d.ts.map +1 -0
  35. package/dist/components/PropertyEditor.js +1002 -0
  36. package/dist/components/PropertyEditor.js.map +1 -0
  37. package/dist/components/RibbonToolbar.d.ts +3 -0
  38. package/dist/components/RibbonToolbar.d.ts.map +1 -0
  39. package/dist/components/RibbonToolbar.js +179 -0
  40. package/dist/components/RibbonToolbar.js.map +1 -0
  41. package/dist/components/TextFormatEditor.d.ts +13 -0
  42. package/dist/components/TextFormatEditor.d.ts.map +1 -0
  43. package/dist/components/TextFormatEditor.js +199 -0
  44. package/dist/components/TextFormatEditor.js.map +1 -0
  45. package/dist/components/TextStyleLibraryDialog.d.ts +8 -0
  46. package/dist/components/TextStyleLibraryDialog.d.ts.map +1 -0
  47. package/dist/components/TextStyleLibraryDialog.js +367 -0
  48. package/dist/components/TextStyleLibraryDialog.js.map +1 -0
  49. package/dist/components/canvas/DesignerCanvasFrame.d.ts +10 -0
  50. package/dist/components/canvas/DesignerCanvasFrame.d.ts.map +1 -0
  51. package/dist/components/canvas/DesignerCanvasFrame.js +22 -0
  52. package/dist/components/canvas/DesignerCanvasFrame.js.map +1 -0
  53. package/dist/components/chart/ChartAxesPanel.d.ts +12 -0
  54. package/dist/components/chart/ChartAxesPanel.d.ts.map +1 -0
  55. package/dist/components/chart/ChartAxesPanel.js +71 -0
  56. package/dist/components/chart/ChartAxesPanel.js.map +1 -0
  57. package/dist/components/chart/ChartDataPanel.d.ts +21 -0
  58. package/dist/components/chart/ChartDataPanel.d.ts.map +1 -0
  59. package/dist/components/chart/ChartDataPanel.js +80 -0
  60. package/dist/components/chart/ChartDataPanel.js.map +1 -0
  61. package/dist/components/chart/ChartLabelPanel.d.ts +12 -0
  62. package/dist/components/chart/ChartLabelPanel.d.ts.map +1 -0
  63. package/dist/components/chart/ChartLabelPanel.js +34 -0
  64. package/dist/components/chart/ChartLabelPanel.js.map +1 -0
  65. package/dist/components/chart/ChartLegendPanel.d.ts +12 -0
  66. package/dist/components/chart/ChartLegendPanel.d.ts.map +1 -0
  67. package/dist/components/chart/ChartLegendPanel.js +48 -0
  68. package/dist/components/chart/ChartLegendPanel.js.map +1 -0
  69. package/dist/components/chart/ChartPropertyPanel.d.ts +26 -0
  70. package/dist/components/chart/ChartPropertyPanel.d.ts.map +1 -0
  71. package/dist/components/chart/ChartPropertyPanel.js +119 -0
  72. package/dist/components/chart/ChartPropertyPanel.js.map +1 -0
  73. package/dist/components/chart/ChartThemePanel.d.ts +9 -0
  74. package/dist/components/chart/ChartThemePanel.d.ts.map +1 -0
  75. package/dist/components/chart/ChartThemePanel.js +21 -0
  76. package/dist/components/chart/ChartThemePanel.js.map +1 -0
  77. package/dist/components/chart/ChartTitlePanel.d.ts +10 -0
  78. package/dist/components/chart/ChartTitlePanel.d.ts.map +1 -0
  79. package/dist/components/chart/ChartTitlePanel.js +45 -0
  80. package/dist/components/chart/ChartTitlePanel.js.map +1 -0
  81. package/dist/components/chart/ChartTypeStylePanel.d.ts +11 -0
  82. package/dist/components/chart/ChartTypeStylePanel.d.ts.map +1 -0
  83. package/dist/components/chart/ChartTypeStylePanel.js +37 -0
  84. package/dist/components/chart/ChartTypeStylePanel.js.map +1 -0
  85. package/dist/components/chart/ColorPaletteEditor.d.ts +10 -0
  86. package/dist/components/chart/ColorPaletteEditor.d.ts.map +1 -0
  87. package/dist/components/chart/ColorPaletteEditor.js +18 -0
  88. package/dist/components/chart/ColorPaletteEditor.js.map +1 -0
  89. package/dist/components/chart/chart-options.d.ts +119 -0
  90. package/dist/components/chart/chart-options.d.ts.map +1 -0
  91. package/dist/components/chart/chart-options.js +217 -0
  92. package/dist/components/chart/chart-options.js.map +1 -0
  93. package/dist/components/dialogs/BandWizardDialog.d.ts +8 -0
  94. package/dist/components/dialogs/BandWizardDialog.d.ts.map +1 -0
  95. package/dist/components/dialogs/BandWizardDialog.js +54 -0
  96. package/dist/components/dialogs/BandWizardDialog.js.map +1 -0
  97. package/dist/components/dialogs/GroupWizardDialog.d.ts +8 -0
  98. package/dist/components/dialogs/GroupWizardDialog.d.ts.map +1 -0
  99. package/dist/components/dialogs/GroupWizardDialog.js +70 -0
  100. package/dist/components/dialogs/GroupWizardDialog.js.map +1 -0
  101. package/dist/components/dialogs/JsonDataSourceDialog.d.ts +8 -0
  102. package/dist/components/dialogs/JsonDataSourceDialog.d.ts.map +1 -0
  103. package/dist/components/dialogs/JsonDataSourceDialog.js +67 -0
  104. package/dist/components/dialogs/JsonDataSourceDialog.js.map +1 -0
  105. package/dist/components/dialogs/PageSetupDialog.d.ts +8 -0
  106. package/dist/components/dialogs/PageSetupDialog.d.ts.map +1 -0
  107. package/dist/components/dialogs/PageSetupDialog.js +145 -0
  108. package/dist/components/dialogs/PageSetupDialog.js.map +1 -0
  109. package/dist/components/dialogs/dialog-utils.d.ts +6 -0
  110. package/dist/components/dialogs/dialog-utils.d.ts.map +1 -0
  111. package/dist/components/dialogs/dialog-utils.js +37 -0
  112. package/dist/components/dialogs/dialog-utils.js.map +1 -0
  113. package/dist/components/events/EventEditorDialog.d.ts +43 -0
  114. package/dist/components/events/EventEditorDialog.d.ts.map +1 -0
  115. package/dist/components/events/EventEditorDialog.js +271 -0
  116. package/dist/components/events/EventEditorDialog.js.map +1 -0
  117. package/dist/components/events/EventScriptEditor.d.ts +41 -0
  118. package/dist/components/events/EventScriptEditor.d.ts.map +1 -0
  119. package/dist/components/events/EventScriptEditor.js +140 -0
  120. package/dist/components/events/EventScriptEditor.js.map +1 -0
  121. package/dist/components/events/event-editor-utils.d.ts +18 -0
  122. package/dist/components/events/event-editor-utils.d.ts.map +1 -0
  123. package/dist/components/events/event-editor-utils.js +66 -0
  124. package/dist/components/events/event-editor-utils.js.map +1 -0
  125. package/dist/components/events/event-script-monaco.d.ts +74 -0
  126. package/dist/components/events/event-script-monaco.d.ts.map +1 -0
  127. package/dist/components/events/event-script-monaco.js +282 -0
  128. package/dist/components/events/event-script-monaco.js.map +1 -0
  129. package/dist/components/events/event-script-templates.d.ts +7 -0
  130. package/dist/components/events/event-script-templates.d.ts.map +1 -0
  131. package/dist/components/events/event-script-templates.js +100 -0
  132. package/dist/components/events/event-script-templates.js.map +1 -0
  133. package/dist/components/expression/ExpressionMonacoEditor.d.ts +16 -0
  134. package/dist/components/expression/ExpressionMonacoEditor.d.ts.map +1 -0
  135. package/dist/components/expression/ExpressionMonacoEditor.js +63 -0
  136. package/dist/components/expression/ExpressionMonacoEditor.js.map +1 -0
  137. package/dist/components/expression/InlineExpressionEditor.d.ts +10 -0
  138. package/dist/components/expression/InlineExpressionEditor.d.ts.map +1 -0
  139. package/dist/components/expression/InlineExpressionEditor.js +33 -0
  140. package/dist/components/expression/InlineExpressionEditor.js.map +1 -0
  141. package/dist/components/expression/expression-monaco.d.ts +34 -0
  142. package/dist/components/expression/expression-monaco.d.ts.map +1 -0
  143. package/dist/components/expression/expression-monaco.js +87 -0
  144. package/dist/components/expression/expression-monaco.js.map +1 -0
  145. package/dist/components/panels/DesignerLeftPanel.d.ts +11 -0
  146. package/dist/components/panels/DesignerLeftPanel.d.ts.map +1 -0
  147. package/dist/components/panels/DesignerLeftPanel.js +8 -0
  148. package/dist/components/panels/DesignerLeftPanel.js.map +1 -0
  149. package/dist/components/panels/DesignerPropertyPanel.d.ts +6 -0
  150. package/dist/components/panels/DesignerPropertyPanel.d.ts.map +1 -0
  151. package/dist/components/panels/DesignerPropertyPanel.js +441 -0
  152. package/dist/components/panels/DesignerPropertyPanel.js.map +1 -0
  153. package/dist/components/panels/PanelSearchBox.d.ts +9 -0
  154. package/dist/components/panels/PanelSearchBox.d.ts.map +1 -0
  155. package/dist/components/panels/PanelSearchBox.js +5 -0
  156. package/dist/components/panels/PanelSearchBox.js.map +1 -0
  157. package/dist/components/properties/BandPropertyGrid.d.ts +6 -0
  158. package/dist/components/properties/BandPropertyGrid.d.ts.map +1 -0
  159. package/dist/components/properties/BandPropertyGrid.js +504 -0
  160. package/dist/components/properties/BandPropertyGrid.js.map +1 -0
  161. package/dist/components/properties/BoxStyleEditors.d.ts +59 -0
  162. package/dist/components/properties/BoxStyleEditors.d.ts.map +1 -0
  163. package/dist/components/properties/BoxStyleEditors.js +87 -0
  164. package/dist/components/properties/BoxStyleEditors.js.map +1 -0
  165. package/dist/components/properties/FontEditor.d.ts +28 -0
  166. package/dist/components/properties/FontEditor.d.ts.map +1 -0
  167. package/dist/components/properties/FontEditor.js +22 -0
  168. package/dist/components/properties/FontEditor.js.map +1 -0
  169. package/dist/components/ribbon/DesignerRibbon.d.ts +3 -0
  170. package/dist/components/ribbon/DesignerRibbon.d.ts.map +1 -0
  171. package/dist/components/ribbon/DesignerRibbon.js +193 -0
  172. package/dist/components/ribbon/DesignerRibbon.js.map +1 -0
  173. package/dist/components/richtext/RichTextInlineEditor.d.ts +15 -0
  174. package/dist/components/richtext/RichTextInlineEditor.d.ts.map +1 -0
  175. package/dist/components/richtext/RichTextInlineEditor.js +94 -0
  176. package/dist/components/richtext/RichTextInlineEditor.js.map +1 -0
  177. package/dist/components/shell/DesignerShell.d.ts +12 -0
  178. package/dist/components/shell/DesignerShell.d.ts.map +1 -0
  179. package/dist/components/shell/DesignerShell.js +124 -0
  180. package/dist/components/shell/DesignerShell.js.map +1 -0
  181. package/dist/components/shell/DesignerStatusBar.d.ts +3 -0
  182. package/dist/components/shell/DesignerStatusBar.d.ts.map +1 -0
  183. package/dist/components/shell/DesignerStatusBar.js +23 -0
  184. package/dist/components/shell/DesignerStatusBar.js.map +1 -0
  185. package/dist/components/tree/ReportTree.d.ts +3 -0
  186. package/dist/components/tree/ReportTree.d.ts.map +1 -0
  187. package/dist/components/tree/ReportTree.js +17 -0
  188. package/dist/components/tree/ReportTree.js.map +1 -0
  189. package/dist/data-source-fields.d.ts +14 -0
  190. package/dist/data-source-fields.d.ts.map +1 -0
  191. package/dist/data-source-fields.js +49 -0
  192. package/dist/data-source-fields.js.map +1 -0
  193. package/dist/data-source-paths.d.ts +10 -0
  194. package/dist/data-source-paths.d.ts.map +1 -0
  195. package/dist/data-source-paths.js +61 -0
  196. package/dist/data-source-paths.js.map +1 -0
  197. package/dist/expression/expression-catalog.d.ts +39 -0
  198. package/dist/expression/expression-catalog.d.ts.map +1 -0
  199. package/dist/expression/expression-catalog.js +127 -0
  200. package/dist/expression/expression-catalog.js.map +1 -0
  201. package/dist/expression/expression-preview.d.ts +11 -0
  202. package/dist/expression/expression-preview.d.ts.map +1 -0
  203. package/dist/expression/expression-preview.js +58 -0
  204. package/dist/expression/expression-preview.js.map +1 -0
  205. package/dist/expression/expression-validation.d.ts +12 -0
  206. package/dist/expression/expression-validation.d.ts.map +1 -0
  207. package/dist/expression/expression-validation.js +85 -0
  208. package/dist/expression/expression-validation.js.map +1 -0
  209. package/dist/expression/function-catalog.d.ts +21 -0
  210. package/dist/expression/function-catalog.d.ts.map +1 -0
  211. package/dist/expression/function-catalog.js +96 -0
  212. package/dist/expression/function-catalog.js.map +1 -0
  213. package/dist/i18n/DesignerI18nProvider.d.ts +11 -0
  214. package/dist/i18n/DesignerI18nProvider.d.ts.map +1 -0
  215. package/dist/i18n/DesignerI18nProvider.js +32 -0
  216. package/dist/i18n/DesignerI18nProvider.js.map +1 -0
  217. package/dist/i18n/index.d.ts +3 -0
  218. package/dist/i18n/index.d.ts.map +1 -0
  219. package/dist/i18n/index.js +2 -0
  220. package/dist/i18n/index.js.map +1 -0
  221. package/dist/i18n/messages.d.ts +5 -0
  222. package/dist/i18n/messages.d.ts.map +1 -0
  223. package/dist/i18n/messages.js +1383 -0
  224. package/dist/i18n/messages.js.map +1 -0
  225. package/dist/index.d.ts +21 -0
  226. package/dist/index.d.ts.map +1 -0
  227. package/dist/index.js +18 -0
  228. package/dist/index.js.map +1 -0
  229. package/dist/page-settings.d.ts +21 -0
  230. package/dist/page-settings.d.ts.map +1 -0
  231. package/dist/page-settings.js +66 -0
  232. package/dist/page-settings.js.map +1 -0
  233. package/dist/report-structure.d.ts +20 -0
  234. package/dist/report-structure.d.ts.map +1 -0
  235. package/dist/report-structure.js +219 -0
  236. package/dist/report-structure.js.map +1 -0
  237. package/dist/store/designer-store.d.ts +161 -0
  238. package/dist/store/designer-store.d.ts.map +1 -0
  239. package/dist/store/designer-store.js +1851 -0
  240. package/dist/store/designer-store.js.map +1 -0
  241. package/dist/table/table-structure.d.ts +50 -0
  242. package/dist/table/table-structure.d.ts.map +1 -0
  243. package/dist/table/table-structure.js +251 -0
  244. package/dist/table/table-structure.js.map +1 -0
  245. package/dist/text-style-application.d.ts +11 -0
  246. package/dist/text-style-application.d.ts.map +1 -0
  247. package/dist/text-style-application.js +135 -0
  248. package/dist/text-style-application.js.map +1 -0
  249. package/dist/text-style-bindings.d.ts +16 -0
  250. package/dist/text-style-bindings.d.ts.map +1 -0
  251. package/dist/text-style-bindings.js +549 -0
  252. package/dist/text-style-bindings.js.map +1 -0
  253. package/package.json +70 -0
@@ -0,0 +1,127 @@
1
+ import { EXPRESSION_FUNCTIONS, } from './function-catalog';
2
+ export const BUILTIN_SYSTEM_VARIABLES = [
3
+ variable('{Today}', {
4
+ 'zh-CN': '当前日期。返回运行报表时的日期,可用于页眉、页脚和日期字段。',
5
+ 'en-US': 'Current date. Returns the date when the report runs and is commonly used in headers, footers, and date fields.',
6
+ }, (ctx) => ctx.date.toISOString().slice(0, 10)),
7
+ variable('{Now}', {
8
+ 'zh-CN': '当前日期时间。返回运行报表时的完整日期和时间。',
9
+ 'en-US': 'Current date and time. Returns the full date and time when the report runs.',
10
+ }, (ctx) => ctx.date.toISOString()),
11
+ variable('{PageNumber}', {
12
+ 'zh-CN': '当前页码。渲染和打印时按实际分页结果输出当前页序号。',
13
+ 'en-US': 'Current page number. Prints the page index from the actual rendered pagination result.',
14
+ }, 1),
15
+ variable('{TotalPages}', {
16
+ 'zh-CN': '总页数。渲染完成后输出报表的总页数。',
17
+ 'en-US': 'Total pages. Prints the total number of pages after the report has been rendered.',
18
+ }, 1),
19
+ variable('{Line}', {
20
+ 'zh-CN': '当前数据行序号。通常用于明细区显示行号。',
21
+ 'en-US': 'Current line number. Usually used in detail bands to display row numbers.',
22
+ }, (ctx) => ctx.rowIndex + 1),
23
+ variable('{RowIndex}', {
24
+ 'zh-CN': '当前数据行索引,从 0 开始。',
25
+ 'en-US': 'Current zero-based data row index.',
26
+ }, (ctx) => ctx.rowIndex),
27
+ variable('{RowNumber}', {
28
+ 'zh-CN': '当前数据行序号,从 1 开始。',
29
+ 'en-US': 'Current one-based data row number.',
30
+ }, (ctx) => ctx.rowIndex + 1),
31
+ variable('{ReportName}', {
32
+ 'zh-CN': '当前报表名称。',
33
+ 'en-US': 'Current report name.',
34
+ }, (ctx) => ctx.templateName),
35
+ variable('{UserName}', {
36
+ 'zh-CN': '当前用户名。预览时使用浏览器环境能够提供的默认用户值。',
37
+ 'en-US': 'Current user name. Preview uses the default user value available in the browser environment.',
38
+ }, 'User'),
39
+ ];
40
+ export const BUILTIN_FORMAT_PATTERNS = [
41
+ format('FORMAT("N0", value)', 'FORMAT("${1:N0}", ${2:value})', '整数数字', 'Number without decimals.', '将数字格式化为整数文本。', 'Formats a number without decimal places.'),
42
+ format('FORMAT("N2", value)', 'FORMAT("${1:N2}", ${2:value})', '两位小数', 'Number with two decimals.', '将数字格式化为保留两位小数的文本。', 'Formats a number with two decimal places.'),
43
+ format('FORMAT("C", value)', 'FORMAT("${1:C}", ${2:value})', '货币', 'Currency.', '将数字格式化为货币文本。', 'Formats a number as currency text.'),
44
+ format('FORMAT("P", value)', 'FORMAT("${1:P}", ${2:value})', '百分比', 'Percent.', '将数字格式化为百分比文本。', 'Formats a number as percentage text.'),
45
+ format('FORMAT("D", value)', 'FORMAT("${1:D}", ${2:value})', '短日期', 'Short date.', '将日期或时间值格式化为短日期文本。', 'Formats a date or time value as a short date.'),
46
+ format('FORMAT("T", value)', 'FORMAT("${1:T}", ${2:value})', '时间', 'Time.', '将日期或时间值格式化为时间文本。', 'Formats a date or time value as time text.'),
47
+ format('#,##0.00', '#,##0.00', '数字模式', 'Number pattern.', '常用数字格式,包含千分位并保留两位小数。', 'Common number pattern with group separators and two decimal places.'),
48
+ format('yyyy-MM-dd', 'yyyy-MM-dd', '日期模式', 'Date pattern.', '常用日期格式,输出年、月、日。', 'Common date pattern that prints year, month, and day.'),
49
+ format('yyyy-MM-dd HH:mm:ss', 'yyyy-MM-dd HH:mm:ss', '日期时间模式', 'Date-time pattern.', '常用日期时间格式,输出日期、小时、分钟和秒。', 'Common date-time pattern that prints date, hour, minute, and second.'),
50
+ format('0.00%', '0.00%', '百分比模式', 'Percentage pattern.', '常用百分比格式,保留两位小数。', 'Common percentage pattern with two decimal places.'),
51
+ format('Yes/No', 'FORMAT("${1:BOOL}", ${2:value})', '布尔文本', 'Boolean text.', '将布尔值格式化为 Yes 或 No。', 'Formats a boolean value as Yes or No.'),
52
+ ];
53
+ export function resolveExpressionCatalog(extensions) {
54
+ const runtimeFunctions = {};
55
+ const functions = mergeUnique(EXPRESSION_FUNCTIONS, extensions?.functions ?? [], item => normalizeFunctionName(item.name), (item) => {
56
+ if (item.evaluate) {
57
+ runtimeFunctions[normalizeFunctionName(item.name)] = item.evaluate;
58
+ }
59
+ const { evaluate: _evaluate, ...meta } = item;
60
+ return meta;
61
+ });
62
+ return {
63
+ functions,
64
+ variables: mergeUnique(BUILTIN_SYSTEM_VARIABLES, extensions?.variables ?? [], item => normalizeVariableName(item.name), item => normalizeVariableMeta(item)),
65
+ formats: mergeUnique(BUILTIN_FORMAT_PATTERNS, extensions?.formats ?? [], item => normalizeFormatName(item.name), item => item),
66
+ runtimeFunctions,
67
+ };
68
+ }
69
+ export function getExpressionVariableValues(catalog, context) {
70
+ const values = {};
71
+ for (const item of catalog.variables) {
72
+ const key = stripVariableBraces(item.name);
73
+ values[key] = typeof item.previewValue === 'function' ? item.previewValue(context) : item.previewValue;
74
+ }
75
+ return values;
76
+ }
77
+ function mergeUnique(builtins, extensions, keyOf, normalizeExtension) {
78
+ const used = new Set();
79
+ const result = [];
80
+ for (const item of builtins) {
81
+ const key = keyOf(item);
82
+ if (!used.has(key)) {
83
+ used.add(key);
84
+ result.push(item);
85
+ }
86
+ }
87
+ for (const item of extensions) {
88
+ const key = keyOf(item);
89
+ if (!used.has(key)) {
90
+ used.add(key);
91
+ result.push(normalizeExtension(item));
92
+ }
93
+ }
94
+ return result;
95
+ }
96
+ function variable(name, description, previewValue) {
97
+ return { name, insertText: name, description, previewValue };
98
+ }
99
+ function format(name, insertText, zhDetail, enDetail, zhDescription, enDescription) {
100
+ return {
101
+ name,
102
+ insertText,
103
+ detail: { 'zh-CN': zhDetail, 'en-US': enDetail },
104
+ description: { 'zh-CN': zhDescription, 'en-US': enDescription },
105
+ };
106
+ }
107
+ function normalizeVariableMeta(item) {
108
+ const name = `{${stripVariableBraces(item.name)}}`;
109
+ return {
110
+ ...item,
111
+ name,
112
+ insertText: item.insertText ?? name,
113
+ };
114
+ }
115
+ function normalizeFunctionName(name) {
116
+ return name.trim().toUpperCase();
117
+ }
118
+ function normalizeVariableName(name) {
119
+ return stripVariableBraces(name).toUpperCase();
120
+ }
121
+ function normalizeFormatName(name) {
122
+ return name.trim().toUpperCase();
123
+ }
124
+ function stripVariableBraces(name) {
125
+ return name.trim().replace(/^\{/, '').replace(/\}$/, '').trim();
126
+ }
127
+ //# sourceMappingURL=expression-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-catalog.js","sourceRoot":"","sources":["../../src/expression/expression-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type ReportTemplate } from '@report-designer/core';
2
+ import { type ExpressionCatalogExtensions } from './expression-catalog';
3
+ export type ExpressionPreviewResult = {
4
+ ok: true;
5
+ value: unknown;
6
+ } | {
7
+ ok: false;
8
+ message: string;
9
+ };
10
+ export declare function previewReportExpression(expression: string, template: ReportTemplate, extensions?: ExpressionCatalogExtensions): ExpressionPreviewResult;
11
+ //# sourceMappingURL=expression-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-preview.d.ts","sourceRoot":"","sources":["../../src/expression/expression-preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,EAGL,KAAK,2BAA2B,EACjC,MAAM,sBAAsB,CAAC;AAE9B,MAAM,MAAM,uBAAuB,GAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,UAAU,CAAC,EAAE,2BAA2B,GACvC,uBAAuB,CAqBzB"}
@@ -0,0 +1,58 @@
1
+ import { evalExpression } from '@report-designer/core';
2
+ import { getExpressionVariableValues, resolveExpressionCatalog, } from './expression-catalog';
3
+ export function previewReportExpression(expression, template, extensions) {
4
+ try {
5
+ const catalog = resolveExpressionCatalog(extensions);
6
+ const sampleRows = buildSampleRows(template);
7
+ const variables = getExpressionVariableValues(catalog, {
8
+ templateName: template.name,
9
+ rowIndex: 0,
10
+ date: new Date(),
11
+ });
12
+ const value = evalExpression(expression, (source, field) => resolveSampleField(sampleRows, source, field), 0, variables, undefined, catalog.runtimeFunctions);
13
+ return { ok: true, value };
14
+ }
15
+ catch (error) {
16
+ return { ok: false, message: error instanceof Error ? error.message : String(error) };
17
+ }
18
+ }
19
+ function buildSampleRows(template) {
20
+ const rows = {};
21
+ for (const source of template.dataSources) {
22
+ const firstSample = Array.isArray(source.sampleRows)
23
+ ? source.sampleRows?.[0]
24
+ : undefined;
25
+ if (firstSample && typeof firstSample === 'object') {
26
+ rows[source.id] = firstSample;
27
+ continue;
28
+ }
29
+ rows[source.id] = {};
30
+ for (const field of source.schema ?? source.fields ?? []) {
31
+ rows[source.id][field.name] = defaultFieldValue(field.type);
32
+ }
33
+ }
34
+ return rows;
35
+ }
36
+ function resolveSampleField(sampleRows, source, field) {
37
+ if (source) {
38
+ return sampleRows[source]?.[field];
39
+ }
40
+ for (const row of Object.values(sampleRows)) {
41
+ if (field in row) {
42
+ return row[field];
43
+ }
44
+ }
45
+ return undefined;
46
+ }
47
+ function defaultFieldValue(type) {
48
+ if (type === 'number')
49
+ return 0;
50
+ if (type === 'boolean')
51
+ return false;
52
+ if (type === 'date')
53
+ return new Date().toISOString();
54
+ if (type === 'null')
55
+ return null;
56
+ return '';
57
+ }
58
+ //# sourceMappingURL=expression-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-preview.js","sourceRoot":"","sources":["../../src/expression/expression-preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ReportTemplate } from '@report-designer/core';
2
+ import { type ExpressionCatalogExtensions } from './expression-catalog';
3
+ export interface ExpressionDiagnostic {
4
+ severity: 'error' | 'warning';
5
+ message: string;
6
+ startLineNumber: number;
7
+ startColumn: number;
8
+ endLineNumber: number;
9
+ endColumn: number;
10
+ }
11
+ export declare function validateReportExpression(expression: string, template: ReportTemplate, extensions?: ExpressionCatalogExtensions): ExpressionDiagnostic[];
12
+ //# sourceMappingURL=expression-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-validation.d.ts","sourceRoot":"","sources":["../../src/expression/expression-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAA4B,KAAK,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAElG,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAaD,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,UAAU,CAAC,EAAE,2BAA2B,GACvC,oBAAoB,EAAE,CAoBxB"}
@@ -0,0 +1,85 @@
1
+ import { parse, tokenize } from '@report-designer/core';
2
+ import { resolveExpressionCatalog } from './expression-catalog';
3
+ function diagnostic(message, column = 1, severity = 'error') {
4
+ return {
5
+ severity,
6
+ message,
7
+ startLineNumber: 1,
8
+ startColumn: column,
9
+ endLineNumber: 1,
10
+ endColumn: Math.max(column + 1, column),
11
+ };
12
+ }
13
+ export function validateReportExpression(expression, template, extensions) {
14
+ const trimmed = expression.trim();
15
+ if (!trimmed)
16
+ return [];
17
+ const catalog = resolveExpressionCatalog(extensions);
18
+ const diagnostics = [
19
+ ...validateBalancedCharacters(expression),
20
+ ...validateFunctionNames(expression, catalog.functions.map(item => item.name)),
21
+ ...validateFieldReferences(expression, template, catalog.variables.map(item => item.name)),
22
+ ];
23
+ if (diagnostics.length === 0) {
24
+ try {
25
+ parse(tokenize(expression));
26
+ }
27
+ catch (error) {
28
+ diagnostics.push(diagnostic(error instanceof Error ? error.message : String(error)));
29
+ }
30
+ }
31
+ return diagnostics;
32
+ }
33
+ function validateBalancedCharacters(expression) {
34
+ const diagnostics = [];
35
+ if (countMatches(expression, /{/g) !== countMatches(expression, /}/g)) {
36
+ diagnostics.push(diagnostic('Brace count does not match'));
37
+ }
38
+ if (countMatches(expression, /\(/g) !== countMatches(expression, /\)/g)) {
39
+ diagnostics.push(diagnostic('Parenthesis count does not match'));
40
+ }
41
+ if (countMatches(expression, /"/g) % 2 !== 0) {
42
+ diagnostics.push(diagnostic('String literal is not closed'));
43
+ }
44
+ return diagnostics;
45
+ }
46
+ function countMatches(value, regex) {
47
+ return (value.match(regex) ?? []).length;
48
+ }
49
+ function validateFunctionNames(expression, functionNames) {
50
+ const supported = new Set(functionNames.map(name => name.toUpperCase()));
51
+ const diagnostics = [];
52
+ const functionCallPattern = /\b([A-Za-z][A-Za-z0-9_]*)\s*\(/g;
53
+ let match;
54
+ while ((match = functionCallPattern.exec(expression))) {
55
+ const functionName = match[1];
56
+ if (!supported.has(functionName.toUpperCase())) {
57
+ diagnostics.push(diagnostic(`Unknown function: ${functionName}`, match.index + 1));
58
+ }
59
+ }
60
+ return diagnostics;
61
+ }
62
+ function validateFieldReferences(expression, template, variableNames) {
63
+ const fields = new Set();
64
+ for (const source of template.dataSources) {
65
+ for (const field of source.schema ?? source.fields ?? []) {
66
+ fields.add(field.name.toLowerCase());
67
+ fields.add(`${source.id}.${field.name}`.toLowerCase());
68
+ }
69
+ }
70
+ const variables = new Set(variableNames.map(name => name.trim().replace(/^\{/, '').replace(/\}$/, '').toLowerCase()));
71
+ const diagnostics = [];
72
+ const fieldPattern = /{([^{}]+)}/g;
73
+ let match;
74
+ while ((match = fieldPattern.exec(expression))) {
75
+ const fieldPath = match[1].trim();
76
+ if (!fieldPath.includes('.') && variables.has(fieldPath.toLowerCase())) {
77
+ continue;
78
+ }
79
+ if (fieldPath.includes('.') && !fields.has(fieldPath.toLowerCase())) {
80
+ diagnostics.push(diagnostic(`Unknown field: {${fieldPath}}`, match.index + 1));
81
+ }
82
+ }
83
+ return diagnostics;
84
+ }
85
+ //# sourceMappingURL=expression-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-validation.js","sourceRoot":"","sources":["../../src/expression/expression-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { DesignerLocale } from '../i18n/messages';
2
+ export type ExpressionFunctionCategory = 'common' | 'aggregate' | 'number' | 'text' | 'date' | 'logic' | 'report' | 'money' | 'format';
3
+ export interface ExpressionFunctionMeta {
4
+ name: string;
5
+ category: ExpressionFunctionCategory;
6
+ description: Record<DesignerLocale, string>;
7
+ signature: string;
8
+ insertText: string;
9
+ detail: string;
10
+ examples: string[];
11
+ }
12
+ export declare function formatExpressionFunctionDocumentation(item: ExpressionFunctionMeta, locale: DesignerLocale): string;
13
+ export declare const EXPRESSION_FUNCTION_CATEGORIES: Array<{
14
+ key: ExpressionFunctionCategory;
15
+ labelKey: string;
16
+ }>;
17
+ export declare const FUNCTION_FOLDER_LABELS: Partial<Record<ExpressionFunctionCategory, string>>;
18
+ export declare const EXPRESSION_FUNCTIONS: ExpressionFunctionMeta[];
19
+ export declare function getExpressionFunctionsByCategory(category: ExpressionFunctionCategory): ExpressionFunctionMeta[];
20
+ export declare function getExpressionFunctionNames(): string[];
21
+ //# sourceMappingURL=function-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-catalog.d.ts","sourceRoot":"","sources":["../../src/expression/function-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,MAAM,0BAA0B,GAClC,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,MAAM,GACN,MAAM,GACN,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,CAAC;AAEb,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,0BAA0B,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,qCAAqC,CAAC,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAOlH;AAED,eAAO,MAAM,8BAA8B,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,0BAA0B,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAUvG,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,OAAO,CAAC,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAItF,CAAC;AAsBF,eAAO,MAAM,oBAAoB,EAAE,sBAAsB,EA6DxD,CAAC;AAEF,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,0BAA0B,GAAG,sBAAsB,EAAE,CAE/G;AAED,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAErD"}
@@ -0,0 +1,96 @@
1
+ export function formatExpressionFunctionDocumentation(item, locale) {
2
+ const exampleLabel = locale === 'zh-CN' ? '示例' : 'Example';
3
+ return [
4
+ item.signature,
5
+ item.description[locale],
6
+ ...item.examples.map(example => `${exampleLabel}: ${example}`),
7
+ ].join('\n');
8
+ }
9
+ export const EXPRESSION_FUNCTION_CATEGORIES = [
10
+ { key: 'common', labelKey: 'expressionEditor.category.common' },
11
+ { key: 'aggregate', labelKey: 'expressionEditor.category.aggregate' },
12
+ { key: 'number', labelKey: 'expressionEditor.category.number' },
13
+ { key: 'text', labelKey: 'expressionEditor.category.text' },
14
+ { key: 'date', labelKey: 'expressionEditor.category.date' },
15
+ { key: 'logic', labelKey: 'expressionEditor.category.logic' },
16
+ { key: 'report', labelKey: 'expressionEditor.category.report' },
17
+ { key: 'money', labelKey: 'expressionEditor.category.money' },
18
+ { key: 'format', labelKey: 'expressionEditor.category.format' },
19
+ ];
20
+ export const FUNCTION_FOLDER_LABELS = {
21
+ aggregate: 'expressionEditor.tree.aggregateFunctions',
22
+ logic: 'expressionEditor.tree.logicFunctions',
23
+ money: 'expressionEditor.tree.moneyFunctions',
24
+ };
25
+ function fn(name, category, zh, en, signature, insertText, examples) {
26
+ return {
27
+ name,
28
+ category,
29
+ description: { 'zh-CN': zh, 'en-US': en },
30
+ signature,
31
+ insertText,
32
+ detail: signature,
33
+ examples,
34
+ };
35
+ }
36
+ export const EXPRESSION_FUNCTIONS = [
37
+ fn('IF', 'common', '根据条件返回两个值中的一个', 'Returns one of two values based on a condition.', 'IF(condition, trueValue, falseValue)', 'IF(${1:condition}, ${2:trueValue}, ${3:falseValue})', ['IF({Orders.Amount} > 0, "Y", "N")']),
38
+ fn('SUM', 'aggregate', '对指定字段表达式进行求和', 'Sums the values of a field expression.', 'SUM(expression)', 'SUM(${1:{Orders.Amount}})', ['SUM({Orders.Amount})']),
39
+ fn('AVG', 'aggregate', '计算指定字段表达式的平均值', 'Calculates the average value of a field expression.', 'AVG(expression)', 'AVG(${1:{Orders.Amount}})', ['AVG({Orders.Amount})']),
40
+ fn('COUNT', 'aggregate', '统计指定字段表达式的非空记录数', 'Counts non-empty values for a field expression.', 'COUNT(expression)', 'COUNT(${1:{Orders.Id}})', ['COUNT({Orders.Id})']),
41
+ fn('COUNTDISTINCT', 'aggregate', '统计指定字段表达式的去重值数量', 'Counts distinct non-empty values for a field expression.', 'COUNTDISTINCT(expression)', 'COUNTDISTINCT(${1:{Orders.CustomerId}})', ['COUNTDISTINCT({Orders.CustomerId})']),
42
+ fn('MIN', 'aggregate', '返回指定字段表达式的最小值', 'Returns the minimum value of a field expression.', 'MIN(expression)', 'MIN(${1:{Orders.Amount}})', ['MIN({Orders.Amount})']),
43
+ fn('MAX', 'aggregate', '返回指定字段表达式的最大值', 'Returns the maximum value of a field expression.', 'MAX(expression)', 'MAX(${1:{Orders.Amount}})', ['MAX({Orders.Amount})']),
44
+ fn('SUMIF', 'aggregate', '对满足条件的记录汇总指定字段表达式', 'Sums a field expression for rows that match a condition.', 'SUMIF(expression, condition)', 'SUMIF(${1:{Orders.Amount}}, "${2:{Orders.Status} = \\"OK\\"}")', ['SUMIF({Orders.Amount}, "{Orders.Status} = \\"OK\\"")']),
45
+ fn('COUNTIF', 'aggregate', '统计满足条件的记录数量', 'Counts rows that match a condition.', 'COUNTIF(condition)', 'COUNTIF("${1:{Orders.Status} = \\"OK\\"}")', ['COUNTIF("{Orders.Status} = \\"OK\\"")']),
46
+ fn('RUNNINGSUM', 'aggregate', '按当前行位置计算运行合计', 'Calculates a running sum up to the current row.', 'RUNNINGSUM(expression)', 'RUNNINGSUM(${1:{Orders.Amount}})', ['RUNNINGSUM({Orders.Amount})']),
47
+ fn('ROUND', 'number', '按指定小数位四舍五入数字', 'Rounds a number to the specified number of digits.', 'ROUND(value, digits)', 'ROUND(${1:value}, ${2:2})', ['ROUND({Orders.Amount}, 2)']),
48
+ fn('CEIL', 'number', '返回大于或等于该值的最小整数', 'Returns the smallest integer greater than or equal to the value.', 'CEIL(value)', 'CEIL(${1:value})', ['CEIL({Orders.Amount})']),
49
+ fn('FLOOR', 'number', '返回小于或等于该值的最大整数', 'Returns the largest integer less than or equal to the value.', 'FLOOR(value)', 'FLOOR(${1:value})', ['FLOOR({Orders.Amount})']),
50
+ fn('ABS', 'number', '返回数字的绝对值', 'Returns the absolute value of a number.', 'ABS(value)', 'ABS(${1:value})', ['ABS({Orders.Amount})']),
51
+ fn('POWER', 'number', '返回数字的指定次幂', 'Raises a number to the specified power.', 'POWER(value, exponent)', 'POWER(${1:value}, ${2:2})', ['POWER({Orders.Amount}, 2)']),
52
+ fn('SQRT', 'number', '返回数字的平方根', 'Returns the square root of a number.', 'SQRT(value)', 'SQRT(${1:value})', ['SQRT({Orders.Amount})']),
53
+ fn('MAXVALUE', 'number', '返回多个值中的最大值', 'Returns the largest value from the provided arguments.', 'MAXVALUE(value1, value2)', 'MAXVALUE(${1:value1}, ${2:value2})', ['MAXVALUE({Orders.Amount}, 100)']),
54
+ fn('MINVALUE', 'number', '返回多个值中的最小值', 'Returns the smallest value from the provided arguments.', 'MINVALUE(value1, value2)', 'MINVALUE(${1:value1}, ${2:value2})', ['MINVALUE({Orders.Amount}, 100)']),
55
+ fn('TONUMBER', 'number', '将文本或值转换为数字', 'Converts text or another value to a number.', 'TONUMBER(value)', 'TONUMBER(${1:value})', ['TONUMBER({Orders.AmountText})']),
56
+ fn('CONCAT', 'text', '按顺序拼接多个文本或字段值', 'Concatenates text and field values in order.', 'CONCAT(value1, value2)', 'CONCAT(${1:value1}, ${2:value2})', ['CONCAT({Customer.Name}, " - ", {Orders.Code})']),
57
+ fn('LEN', 'text', '返回文本的字符长度', 'Returns the character length of a text value.', 'LEN(value)', 'LEN(${1:value})', ['LEN({Customer.Name})']),
58
+ fn('UPPER', 'text', '将文本转换为大写', 'Converts text to uppercase.', 'UPPER(value)', 'UPPER(${1:value})', ['UPPER({Customer.Code})']),
59
+ fn('LOWER', 'text', '将文本转换为小写', 'Converts text to lowercase.', 'LOWER(value)', 'LOWER(${1:value})', ['LOWER({Customer.Code})']),
60
+ fn('TRIM', 'text', '移除文本首尾空白字符', 'Removes leading and trailing whitespace.', 'TRIM(value)', 'TRIM(${1:value})', ['TRIM({Customer.Name})']),
61
+ fn('SUBSTRING', 'text', '按起始位置和长度截取文本', 'Returns part of a text value by start position and length.', 'SUBSTRING(value, start, length)', 'SUBSTRING(${1:value}, ${2:0}, ${3:3})', ['SUBSTRING({Customer.Name}, 0, 3)']),
62
+ fn('LEFT', 'text', '从左侧截取指定长度的文本', 'Returns the leftmost characters from text.', 'LEFT(value, count)', 'LEFT(${1:value}, ${2:3})', ['LEFT({Customer.Name}, 3)']),
63
+ fn('RIGHT', 'text', '从右侧截取指定长度的文本', 'Returns the rightmost characters from text.', 'RIGHT(value, count)', 'RIGHT(${1:value}, ${2:4})', ['RIGHT({Customer.Phone}, 4)']),
64
+ fn('REPLACE', 'text', '替换文本中的指定内容', 'Replaces all occurrences of a search value in text.', 'REPLACE(value, search, replacement)', 'REPLACE(${1:value}, ${2:search}, ${3:replacement})', ['REPLACE({Customer.Phone}, "-", "")']),
65
+ fn('INDEXOF', 'text', '返回文本中指定内容的位置', 'Returns the zero-based position of a search value in text.', 'INDEXOF(value, search)', 'INDEXOF(${1:value}, ${2:search})', ['INDEXOF({Customer.Name}, "Ltd")']),
66
+ fn('CONTAINS', 'text', '判断文本是否包含指定内容', 'Checks whether text contains the specified value.', 'CONTAINS(value, search)', 'CONTAINS(${1:value}, ${2:search})', ['CONTAINS({Customer.Name}, "Ltd")']),
67
+ fn('STARTSWITH', 'text', '判断文本是否以指定内容开头', 'Checks whether text starts with the specified value.', 'STARTSWITH(value, search)', 'STARTSWITH(${1:value}, ${2:search})', ['STARTSWITH({Customer.Code}, "A")']),
68
+ fn('ENDSWITH', 'text', '判断文本是否以指定内容结尾', 'Checks whether text ends with the specified value.', 'ENDSWITH(value, search)', 'ENDSWITH(${1:value}, ${2:search})', ['ENDSWITH({Customer.Code}, "Z")']),
69
+ fn('TOSTRING', 'text', '将值转换为文本', 'Converts a value to text.', 'TOSTRING(value)', 'TOSTRING(${1:value})', ['TOSTRING({Orders.Amount})']),
70
+ fn('NOW', 'date', '返回当前日期和时间', 'Returns the current date and time.', 'NOW()', 'NOW()', ['NOW()']),
71
+ fn('TODAY', 'date', '返回当前日期,不包含时间部分', 'Returns the current date without a time component.', 'TODAY()', 'TODAY()', ['TODAY()']),
72
+ fn('YEAR', 'date', '返回日期中的年份', 'Returns the year part of a date.', 'YEAR(date)', 'YEAR(${1:date})', ['YEAR({Orders.Date})']),
73
+ fn('MONTH', 'date', '返回日期中的月份', 'Returns the month part of a date.', 'MONTH(date)', 'MONTH(${1:date})', ['MONTH({Orders.Date})']),
74
+ fn('DAY', 'date', '返回日期中的日', 'Returns the day part of a date.', 'DAY(date)', 'DAY(${1:date})', ['DAY({Orders.Date})']),
75
+ fn('DATEFORMAT', 'date', '按指定日期格式输出文本', 'Formats a date using the specified pattern.', 'DATEFORMAT(date, pattern)', 'DATEFORMAT(${1:date}, "${2:yyyy-MM-dd}")', ['DATEFORMAT({Orders.Date}, "yyyy-MM-dd")']),
76
+ fn('DATEADD', 'date', '按指定单位对日期进行加减', 'Adds or subtracts a date interval using the specified unit.', 'DATEADD(date, unit, amount)', 'DATEADD(${1:date}, "${2:day}", ${3:1})', ['DATEADD({Orders.Date}, "day", 7)']),
77
+ fn('DATEDIFF', 'date', '按指定单位计算两个日期之间的差值', 'Calculates the difference between two dates using the specified unit.', 'DATEDIFF(start, end, unit)', 'DATEDIFF(${1:start}, ${2:end}, "${3:day}")', ['DATEDIFF({Orders.Start}, {Orders.End}, "day")']),
78
+ fn('IIF', 'logic', 'IF 函数的别名,根据条件返回两个值中的一个', 'Alias of IF; returns one of two values based on a condition.', 'IIF(condition, trueValue, falseValue)', 'IIF(${1:condition}, ${2:trueValue}, ${3:falseValue})', ['IIF({Orders.Amount} > 0, "Y", "N")']),
79
+ fn('ISNULL', 'logic', '判断值是否为空或未定义', 'Checks whether a value is null or undefined.', 'ISNULL(value)', 'ISNULL(${1:value})', ['ISNULL({Customer.Name})']),
80
+ fn('ISEMPTY', 'logic', '判断值是否为空文本、空值或未定义', 'Checks whether a value is empty, null, or undefined.', 'ISEMPTY(value)', 'ISEMPTY(${1:value})', ['ISEMPTY({Customer.Name})']),
81
+ fn('ISNUMBER', 'logic', '判断值是否可转换为数字', 'Checks whether a value can be treated as a number.', 'ISNUMBER(value)', 'ISNUMBER(${1:value})', ['ISNUMBER({Orders.Amount})']),
82
+ fn('ISDATE', 'logic', '判断值是否可转换为日期', 'Checks whether a value can be treated as a date.', 'ISDATE(value)', 'ISDATE(${1:value})', ['ISDATE({Orders.Date})']),
83
+ fn('COALESCE', 'logic', '返回参数中的第一个非空值', 'Returns the first non-null value from the provided arguments.', 'COALESCE(value1, value2)', 'COALESCE(${1:value1}, ${2:value2})', ['COALESCE({Customer.Name}, "Unknown")']),
84
+ fn('PAGE', 'report', '返回当前渲染页码', 'Returns the current rendered page number.', 'PAGE()', 'PAGE()', ['PAGE()']),
85
+ fn('TOTALPAGES', 'report', '返回报表总页数', 'Returns the total number of rendered pages.', 'TOTALPAGES()', 'TOTALPAGES()', ['TOTALPAGES()']),
86
+ fn('ROWINDEX', 'report', '返回当前数据行的从零开始索引', 'Returns the zero-based index of the current data row.', 'ROWINDEX()', 'ROWINDEX()', ['ROWINDEX()']),
87
+ fn('RMBUPPER', 'money', '将金额转换为人民币中文大写', 'Converts an amount to uppercase Chinese RMB text.', 'RMBUPPER(value)', 'RMBUPPER(${1:value})', ['RMBUPPER({Orders.Amount})']),
88
+ fn('FORMAT', 'format', '按指定格式化模式输出值', 'Formats a value with the specified format pattern.', 'FORMAT(pattern, value)', 'FORMAT("${1:N2}", ${2:value})', ['FORMAT("C", {Orders.Amount})']),
89
+ ];
90
+ export function getExpressionFunctionsByCategory(category) {
91
+ return EXPRESSION_FUNCTIONS.filter(item => item.category === category);
92
+ }
93
+ export function getExpressionFunctionNames() {
94
+ return EXPRESSION_FUNCTIONS.map(item => item.name);
95
+ }
96
+ //# sourceMappingURL=function-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-catalog.js","sourceRoot":"","sources":["../../src/expression/function-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { type DesignerLocale, type DesignerMessageKey } from './messages';
3
+ export declare const DesignerI18nProvider: React.FC<React.PropsWithChildren<{
4
+ locale?: DesignerLocale;
5
+ }>>;
6
+ export declare function useDesignerI18n(): {
7
+ locale: DesignerLocale;
8
+ t: (key: DesignerMessageKey, values?: Record<string, string | number>) => string;
9
+ };
10
+ export type { DesignerLocale, DesignerMessageKey };
11
+ //# sourceMappingURL=DesignerI18nProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DesignerI18nProvider.d.ts","sourceRoot":"","sources":["../../src/i18n/DesignerI18nProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAClE,OAAO,EAAoB,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAkB5F,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAClE,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB,CAAC,CAcD,CAAC;AAEF,wBAAgB,eAAe;YAKN,cAAc;aACxB,kBAAkB,WAAW,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;EAI1E;AAED,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useMemo } from 'react';
3
+ import { designerMessages } from './messages';
4
+ const DesignerI18nContext = createContext(null);
5
+ function interpolate(message, values) {
6
+ if (!values) {
7
+ return message;
8
+ }
9
+ return message.replace(/\{(\w+)\}/g, (match, key) => (Object.prototype.hasOwnProperty.call(values, key) ? String(values[key]) : match));
10
+ }
11
+ export const DesignerI18nProvider = ({ children, locale = 'zh-CN' }) => {
12
+ const value = useMemo(() => {
13
+ const messages = designerMessages[locale] ?? designerMessages['zh-CN'];
14
+ return {
15
+ locale,
16
+ t: (key, values) => interpolate(messages[key] ?? designerMessages['en-US'][key] ?? key, values),
17
+ };
18
+ }, [locale]);
19
+ return (_jsx(DesignerI18nContext.Provider, { value: value, children: children }));
20
+ };
21
+ export function useDesignerI18n() {
22
+ const context = useContext(DesignerI18nContext);
23
+ if (!context) {
24
+ const messages = designerMessages['zh-CN'];
25
+ return {
26
+ locale: 'zh-CN',
27
+ t: (key, values) => interpolate(messages[key] ?? key, values),
28
+ };
29
+ }
30
+ return context;
31
+ }
32
+ //# sourceMappingURL=DesignerI18nProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DesignerI18nProvider.js","sourceRoot":"","sources":["../../src/i18n/DesignerI18nProvider.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAgD,MAAM,YAAY,CAAC;AAO5F,MAAM,mBAAmB,GAAG,aAAa,CAAkC,IAAI,CAAC,CAAC;AAEjF,SAAS,WAAW,CAAC,OAAe,EAAE,MAAwC;IAC5E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CACnD,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAChF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAE3B,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE,EAAE;IACvC,MAAM,KAAK,GAAG,OAAO,CAA2B,GAAG,EAAE;QACnD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACvE,OAAO;YACL,MAAM;YACN,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,MAAM,CAAC;SAChG,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,CACL,KAAC,mBAAmB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACvC,QAAQ,GACoB,CAChC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO;YACL,MAAM,EAAE,OAAyB;YACjC,CAAC,EAAE,CAAC,GAAuB,EAAE,MAAwC,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,MAAM,CAAC;SACpH,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { DesignerI18nProvider, useDesignerI18n } from './DesignerI18nProvider';
2
+ export type { DesignerLocale, DesignerMessageKey } from './DesignerI18nProvider';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { DesignerI18nProvider, useDesignerI18n } from './DesignerI18nProvider';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}