@robot-admin/naive-ui-components 0.14.0 → 0.14.2

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 (120) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +2 -0
  3. package/dist/C_AntV.css +64 -64
  4. package/dist/C_Breadcrumb.css +11 -12
  5. package/dist/C_Captcha.css +6 -7
  6. package/dist/C_Cascade.css +4 -5
  7. package/dist/C_ContextMenu.css +6 -6
  8. package/dist/C_Cron.css +105 -104
  9. package/dist/C_Draggable.css +10 -9
  10. package/dist/C_FilePreview.css +153 -153
  11. package/dist/C_Form.base.css +319 -319
  12. package/dist/C_Form.css +319 -319
  13. package/dist/C_FormulaEditor.css +337 -257
  14. package/dist/C_GlobalSearch.css +10 -11
  15. package/dist/C_Guide.css +6 -5
  16. package/dist/C_ImageCropper.css +5 -6
  17. package/dist/C_Loading.css +7 -8
  18. package/dist/C_Login.css +6 -6
  19. package/dist/C_Markdown.css +5 -6
  20. package/dist/C_NotificationCenter.css +172 -172
  21. package/dist/C_OrgChart.css +6 -6
  22. package/dist/C_SplitPane.css +22 -23
  23. package/dist/C_Steps.css +4 -5
  24. package/dist/C_Table.base.css +331 -331
  25. package/dist/C_Table.css +331 -331
  26. package/dist/C_Tabs.css +4 -5
  27. package/dist/C_TagsView.css +32 -31
  28. package/dist/C_Tree.css +16 -15
  29. package/dist/C_VideoPlayer.css +146 -146
  30. package/dist/C_WorkFlow.css +224 -224
  31. package/dist/constants3.d.cts +2 -2
  32. package/dist/constants3.d.ts +2 -2
  33. package/dist/constants4.d.cts +7 -7
  34. package/dist/constants4.d.ts +7 -7
  35. package/dist/constants5.d.cts +2 -2
  36. package/dist/constants5.d.ts +2 -2
  37. package/dist/data.d.cts +9 -9
  38. package/dist/data.d.ts +9 -9
  39. package/dist/index.vue.d.cts +5 -5
  40. package/dist/index.vue.d.ts +5 -5
  41. package/dist/index10.vue.d.cts +3 -3
  42. package/dist/index10.vue.d.ts +2 -2
  43. package/dist/index11.vue.d.cts +2 -2
  44. package/dist/index11.vue.d.ts +4 -4
  45. package/dist/index12.vue.d.cts +4 -4
  46. package/dist/index12.vue.d.ts +2 -2
  47. package/dist/index13.vue.d.cts +2 -2
  48. package/dist/index13.vue.d.ts +5 -5
  49. package/dist/index14.vue.d.cts +5 -5
  50. package/dist/index14.vue.d.ts +4 -4
  51. package/dist/index15.vue.d.cts +4 -4
  52. package/dist/index15.vue.d.ts +1 -1
  53. package/dist/index16.vue.d.cts +1 -1
  54. package/dist/index18.vue.d.ts +3 -3
  55. package/dist/index19.vue.d.cts +3 -3
  56. package/dist/index19.vue.d.ts +1 -1
  57. package/dist/index2.vue.d.cts +3 -3
  58. package/dist/index2.vue.d.ts +3 -3
  59. package/dist/index20.vue.d.cts +2 -2
  60. package/dist/index20.vue.d.ts +2 -2
  61. package/dist/index21.vue.d.cts +1 -1
  62. package/dist/index21.vue.d.ts +1 -1
  63. package/dist/index22.vue.d.cts +2 -2
  64. package/dist/index22.vue.d.ts +2 -2
  65. package/dist/index23.vue.d.cts +1 -1
  66. package/dist/index23.vue.d.ts +1 -1
  67. package/dist/index25.vue.d.cts +3 -3
  68. package/dist/index25.vue.d.ts +3 -3
  69. package/dist/index26.vue.d.cts +1 -1
  70. package/dist/index26.vue.d.ts +1 -1
  71. package/dist/index27.vue.d.cts +3 -3
  72. package/dist/index27.vue.d.ts +3 -3
  73. package/dist/index28.vue.d.cts +2 -2
  74. package/dist/index28.vue.d.ts +2 -2
  75. package/dist/index3.vue.d.cts +4 -4
  76. package/dist/index3.vue.d.ts +4 -4
  77. package/dist/index4.vue.d.cts +1 -1
  78. package/dist/index6.vue.d.ts +2 -2
  79. package/dist/index7.vue.d.cts +2 -2
  80. package/dist/index9.vue.d.ts +3 -3
  81. package/dist/mapUtils.d.cts +1 -1
  82. package/dist/mapUtils.d.ts +1 -1
  83. package/dist/presets.d.cts +1 -1
  84. package/dist/presets.d.ts +1 -1
  85. package/dist/style.css +8744 -8663
  86. package/dist/useCalendarEvents.d.cts +2 -2
  87. package/dist/useCalendarEvents.d.ts +2 -2
  88. package/dist/useCollapsePanel.d.cts +3 -3
  89. package/dist/useCollapsePanel.d.ts +3 -3
  90. package/dist/useCropperCore.d.cts +6 -6
  91. package/dist/useCropperCore.d.ts +6 -6
  92. package/dist/useDraggableLayout.d.cts +8 -8
  93. package/dist/useDraggableLayout.d.ts +8 -8
  94. package/dist/useDynamicFormState.d.cts +2 -2
  95. package/dist/useDynamicFormState.d.ts +2 -2
  96. package/dist/useEdgeInteraction.d.cts +2 -2
  97. package/dist/useEdgeInteraction.d.ts +2 -2
  98. package/dist/useFormulaEvaluator.cjs +1 -1
  99. package/dist/useFormulaEvaluator.js +1 -1
  100. package/dist/useGlobalSearch.d.cts +1 -1
  101. package/dist/useGlobalSearch.d.ts +1 -1
  102. package/dist/useInfiniteScroll.d.cts +3 -3
  103. package/dist/useInfiniteScroll.d.ts +3 -3
  104. package/dist/useQRCode.d.cts +4 -4
  105. package/dist/useQRCode.d.ts +4 -4
  106. package/dist/useSearchState.d.cts +9 -9
  107. package/dist/useSearchState.d.ts +9 -9
  108. package/dist/useSignatureHistory.d.cts +4 -4
  109. package/dist/useSignatureHistory.d.ts +4 -4
  110. package/dist/useSplitResize.d.cts +9 -9
  111. package/dist/useSplitResize.d.ts +9 -9
  112. package/dist/useTimeSelection.d.cts +3 -3
  113. package/dist/useTimeSelection.d.ts +3 -3
  114. package/dist/useTreeOperations.d.cts +6 -6
  115. package/dist/useTreeOperations.d.ts +6 -6
  116. package/dist/useWorkflowValidation.d.cts +5 -5
  117. package/dist/useWorkflowValidation.d.ts +5 -5
  118. package/dist/verification.d.cts +4 -4
  119. package/dist/verification.d.ts +4 -4
  120. package/package.json +1 -1
@@ -66,9 +66,9 @@ declare const __VLS_export: vue.DefineComponent<CalendarProps, CalendarExpose, {
66
66
  }) => any) | undefined;
67
67
  "onEvent-dropped"?: ((event: Partial<CalendarEvent>) => any) | undefined;
68
68
  }>, {
69
- editable: boolean;
70
- initialView: CalendarViewType;
71
69
  events: CalendarEvent[];
70
+ initialView: CalendarViewType;
71
+ editable: boolean;
72
72
  showAddDialog: boolean;
73
73
  showEditDialog: boolean;
74
74
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
@@ -66,9 +66,9 @@ declare const __VLS_export: vue.DefineComponent<CalendarProps, CalendarExpose, {
66
66
  }) => any) | undefined;
67
67
  "onEvent-dropped"?: ((event: Partial<CalendarEvent>) => any) | undefined;
68
68
  }>, {
69
- editable: boolean;
70
- initialView: CalendarViewType;
71
69
  events: CalendarEvent[];
70
+ initialView: CalendarViewType;
71
+ editable: boolean;
72
72
  showAddDialog: boolean;
73
73
  showEditDialog: boolean;
74
74
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
@@ -72,21 +72,21 @@ type __VLS_Slots = {} & { [K in NonNullable<typeof __VLS_7>]?: (props: typeof __
72
72
  declare const __VLS_base: vue.DefineComponent<Props, CollapsePanelExpose, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
73
73
  change: (activeKeys: string[]) => any;
74
74
  expand: (key: string) => any;
75
- "update:activeKeys": (keys: string[]) => any;
76
75
  collapse: (key: string) => any;
76
+ "update:activeKeys": (keys: string[]) => any;
77
77
  }, string, vue.PublicProps, Readonly<Props> & Readonly<{
78
78
  onChange?: ((activeKeys: string[]) => any) | undefined;
79
79
  onExpand?: ((key: string) => any) | undefined;
80
- "onUpdate:activeKeys"?: ((keys: string[]) => any) | undefined;
81
80
  onCollapse?: ((key: string) => any) | undefined;
81
+ "onUpdate:activeKeys"?: ((keys: string[]) => any) | undefined;
82
82
  }>, {
83
83
  bordered: boolean;
84
84
  activeKeys: string[];
85
+ persistKey: string;
85
86
  defaultActiveKeys: string[];
86
87
  accordion: boolean;
87
88
  variant: CollapsePanelVariant;
88
89
  expandIconPosition: ExpandIconPosition;
89
- persistKey: string;
90
90
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
91
91
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
92
92
  declare const _default: typeof __VLS_export;
@@ -72,21 +72,21 @@ type __VLS_Slots = {} & { [K in NonNullable<typeof __VLS_7>]?: (props: typeof __
72
72
  declare const __VLS_base: vue.DefineComponent<Props, CollapsePanelExpose, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
73
73
  change: (activeKeys: string[]) => any;
74
74
  expand: (key: string) => any;
75
- "update:activeKeys": (keys: string[]) => any;
76
75
  collapse: (key: string) => any;
76
+ "update:activeKeys": (keys: string[]) => any;
77
77
  }, string, vue.PublicProps, Readonly<Props> & Readonly<{
78
78
  onChange?: ((activeKeys: string[]) => any) | undefined;
79
79
  onExpand?: ((key: string) => any) | undefined;
80
- "onUpdate:activeKeys"?: ((keys: string[]) => any) | undefined;
81
80
  onCollapse?: ((key: string) => any) | undefined;
81
+ "onUpdate:activeKeys"?: ((keys: string[]) => any) | undefined;
82
82
  }>, {
83
83
  bordered: boolean;
84
84
  activeKeys: string[];
85
+ persistKey: string;
85
86
  defaultActiveKeys: string[];
86
87
  accordion: boolean;
87
88
  variant: CollapsePanelVariant;
88
89
  expandIconPosition: ExpandIconPosition;
89
- persistKey: string;
90
90
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
91
91
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
92
92
  declare const _default: typeof __VLS_export;
@@ -51,24 +51,23 @@ interface ImageCropperEmits {
51
51
  //#endregion
52
52
  //#region src/components/C_ImageCropper/index.vue.d.ts
53
53
  declare const __VLS_export: vue.DefineComponent<ImageCropperProps, ImageCropperExpose, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
54
- cancel: () => any;
55
- confirm: (result: CropResult) => any;
56
54
  error: (error: Error) => any;
55
+ cancel: () => any;
57
56
  crop: (result: CropResult) => any;
58
57
  ready: () => any;
58
+ confirm: (result: CropResult) => any;
59
59
  }, string, vue.PublicProps, Readonly<ImageCropperProps> & Readonly<{
60
- onCancel?: (() => any) | undefined;
61
- onConfirm?: ((result: CropResult) => any) | undefined;
62
60
  onError?: ((error: Error) => any) | undefined;
61
+ onCancel?: (() => any) | undefined;
63
62
  onCrop?: ((result: CropResult) => any) | undefined;
64
63
  onReady?: (() => any) | undefined;
64
+ onConfirm?: ((result: CropResult) => any) | undefined;
65
65
  }>, {
66
- modalTitle: string;
67
66
  disabled: boolean;
68
67
  height: string | number;
69
68
  showToolbar: boolean;
70
- aspectRatio: number;
71
69
  src: string;
70
+ aspectRatio: number;
72
71
  outputFormat: CropOutputFormat;
73
72
  outputQuality: number;
74
73
  maxOutputWidth: number;
@@ -76,6 +75,7 @@ declare const __VLS_export: vue.DefineComponent<ImageCropperProps, ImageCropperE
76
75
  showPreview: boolean;
77
76
  circular: boolean;
78
77
  modal: boolean;
78
+ modalTitle: string;
79
79
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
80
80
  declare const _default: typeof __VLS_export;
81
81
  //#endregion
@@ -51,24 +51,23 @@ interface ImageCropperEmits {
51
51
  //#endregion
52
52
  //#region src/components/C_ImageCropper/index.vue.d.ts
53
53
  declare const __VLS_export: vue.DefineComponent<ImageCropperProps, ImageCropperExpose, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
54
- cancel: () => any;
55
- confirm: (result: CropResult) => any;
56
54
  error: (error: Error) => any;
55
+ cancel: () => any;
57
56
  crop: (result: CropResult) => any;
58
57
  ready: () => any;
58
+ confirm: (result: CropResult) => any;
59
59
  }, string, vue.PublicProps, Readonly<ImageCropperProps> & Readonly<{
60
- onCancel?: (() => any) | undefined;
61
- onConfirm?: ((result: CropResult) => any) | undefined;
62
60
  onError?: ((error: Error) => any) | undefined;
61
+ onCancel?: (() => any) | undefined;
63
62
  onCrop?: ((result: CropResult) => any) | undefined;
64
63
  onReady?: (() => any) | undefined;
64
+ onConfirm?: ((result: CropResult) => any) | undefined;
65
65
  }>, {
66
- modalTitle: string;
67
66
  disabled: boolean;
68
67
  height: string | number;
69
68
  showToolbar: boolean;
70
- aspectRatio: number;
71
69
  src: string;
70
+ aspectRatio: number;
72
71
  outputFormat: CropOutputFormat;
73
72
  outputQuality: number;
74
73
  maxOutputWidth: number;
@@ -76,6 +75,7 @@ declare const __VLS_export: vue.DefineComponent<ImageCropperProps, ImageCropperE
76
75
  showPreview: boolean;
77
76
  circular: boolean;
78
77
  modal: boolean;
78
+ modalTitle: string;
79
79
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
80
80
  declare const _default: typeof __VLS_export;
81
81
  //#endregion
@@ -116,18 +116,12 @@ declare const __VLS_base: vue.DefineComponent<DraggableProps, {
116
116
  "onItem-remove"?: ((item: DraggableItem, index: number) => any) | undefined;
117
117
  "onList-change"?: ((list: DraggableItem[]) => any) | undefined;
118
118
  }>, {
119
+ sort: boolean;
119
120
  modelValue: DraggableItem[];
120
- layout: LayoutMode;
121
121
  disabled: boolean;
122
- sort: boolean;
123
- direction: "vertical" | "horizontal";
124
- itemClass: string;
125
- delay: number;
126
- justifyContent: JustifyContent;
127
- gap: string | number;
128
- emptyText: string;
129
122
  group: string | GroupOptions;
130
123
  animation: number;
124
+ delay: number;
131
125
  handle: string;
132
126
  showHandle: boolean;
133
127
  ghostClass: string;
@@ -135,12 +129,18 @@ declare const __VLS_base: vue.DefineComponent<DraggableProps, {
135
129
  dragClass: string;
136
130
  wrapperClass: string;
137
131
  listClass: string;
132
+ itemClass: string;
138
133
  showEmptyState: boolean;
134
+ emptyText: string;
139
135
  swapThreshold: number;
140
136
  invertSwap: boolean;
137
+ direction: "vertical" | "horizontal";
138
+ layout: LayoutMode;
141
139
  gridColumns: number;
142
140
  gridRows: number;
141
+ gap: string | number;
143
142
  flexWrap: boolean;
143
+ justifyContent: JustifyContent;
144
144
  alignItems: AlignItems;
145
145
  customStyles: Record<string, string | number>;
146
146
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
@@ -116,18 +116,12 @@ declare const __VLS_base: vue.DefineComponent<DraggableProps, {
116
116
  "onItem-remove"?: ((item: DraggableItem, index: number) => any) | undefined;
117
117
  "onList-change"?: ((list: DraggableItem[]) => any) | undefined;
118
118
  }>, {
119
+ sort: boolean;
119
120
  modelValue: DraggableItem[];
120
- layout: LayoutMode;
121
121
  disabled: boolean;
122
- sort: boolean;
123
- direction: "vertical" | "horizontal";
124
- itemClass: string;
125
- delay: number;
126
- justifyContent: JustifyContent;
127
- gap: string | number;
128
- emptyText: string;
129
122
  group: string | GroupOptions;
130
123
  animation: number;
124
+ delay: number;
131
125
  handle: string;
132
126
  showHandle: boolean;
133
127
  ghostClass: string;
@@ -135,12 +129,18 @@ declare const __VLS_base: vue.DefineComponent<DraggableProps, {
135
129
  dragClass: string;
136
130
  wrapperClass: string;
137
131
  listClass: string;
132
+ itemClass: string;
138
133
  showEmptyState: boolean;
134
+ emptyText: string;
139
135
  swapThreshold: number;
140
136
  invertSwap: boolean;
137
+ direction: "vertical" | "horizontal";
138
+ layout: LayoutMode;
141
139
  gridColumns: number;
142
140
  gridRows: number;
141
+ gap: string | number;
143
142
  flexWrap: boolean;
143
+ justifyContent: JustifyContent;
144
144
  alignItems: AlignItems;
145
145
  customStyles: Record<string, string | number>;
146
146
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
@@ -605,8 +605,8 @@ declare const __VLS_export: <T extends object = FormRecord>(__VLS_props: NonNull
605
605
  config?: FormConfig<T>; /** 当前表单实例的自定义渲染器,不污染全局注册表 */
606
606
  renderers?: Record<string, FormRenderer>;
607
607
  } & {
608
- onSubmit?: ((payload: SubmitEventPayload<T>) => any) | undefined;
609
608
  "onUpdate:modelValue"?: ((model: T) => any) | undefined;
609
+ onSubmit?: ((payload: SubmitEventPayload<T>) => any) | undefined;
610
610
  "onValidate-success"?: ((model: T) => any) | undefined;
611
611
  "onValidate-error"?: ((errors: unknown) => any) | undefined;
612
612
  }> & (typeof globalThis extends {
@@ -651,7 +651,7 @@ declare const __VLS_export: <T extends object = FormRecord>(__VLS_props: NonNull
651
651
  }>) => void;
652
652
  attrs: any;
653
653
  slots: FormSlots<T>;
654
- emit: ((evt: "submit", payload: SubmitEventPayload<T>) => void) & ((evt: "update:modelValue", model: T) => void) & ((evt: "validate-success", model: T) => void) & ((evt: "validate-error", errors: unknown) => void);
654
+ emit: ((evt: "update:modelValue", model: T) => void) & ((evt: "submit", payload: SubmitEventPayload<T>) => void) & ((evt: "validate-success", model: T) => void) & ((evt: "validate-error", errors: unknown) => void);
655
655
  }>) => vue.VNode & {
656
656
  __ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
657
657
  };
@@ -605,8 +605,8 @@ declare const __VLS_export: <T extends object = FormRecord>(__VLS_props: NonNull
605
605
  config?: FormConfig<T>; /** 当前表单实例的自定义渲染器,不污染全局注册表 */
606
606
  renderers?: Record<string, FormRenderer>;
607
607
  } & {
608
- onSubmit?: ((payload: SubmitEventPayload<T>) => any) | undefined;
609
608
  "onUpdate:modelValue"?: ((model: T) => any) | undefined;
609
+ onSubmit?: ((payload: SubmitEventPayload<T>) => any) | undefined;
610
610
  "onValidate-success"?: ((model: T) => any) | undefined;
611
611
  "onValidate-error"?: ((errors: unknown) => any) | undefined;
612
612
  }> & (typeof globalThis extends {
@@ -651,7 +651,7 @@ declare const __VLS_export: <T extends object = FormRecord>(__VLS_props: NonNull
651
651
  }>) => void;
652
652
  attrs: any;
653
653
  slots: FormSlots<T>;
654
- emit: ((evt: "submit", payload: SubmitEventPayload<T>) => void) & ((evt: "update:modelValue", model: T) => void) & ((evt: "validate-success", model: T) => void) & ((evt: "validate-error", errors: unknown) => void);
654
+ emit: ((evt: "update:modelValue", model: T) => void) & ((evt: "submit", payload: SubmitEventPayload<T>) => void) & ((evt: "validate-success", model: T) => void) & ((evt: "validate-error", errors: unknown) => void);
655
655
  }>) => vue.VNode & {
656
656
  __ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
657
657
  };
@@ -259,11 +259,11 @@ declare const __VLS_export: vue.DefineComponent<Props, {
259
259
  onReady?: ((graph: Graph) => any) | undefined;
260
260
  "onData-change"?: ((data: DiagramData) => any) | undefined;
261
261
  }>, {
262
- width: string | number;
263
- readonly: boolean;
264
262
  theme: "light" | "dark";
263
+ width: string | number;
265
264
  height: string | number;
266
265
  showToolbar: boolean;
266
+ readonly: boolean;
267
267
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
268
268
  declare const _default: typeof __VLS_export;
269
269
  //#endregion
@@ -259,11 +259,11 @@ declare const __VLS_export: vue.DefineComponent<Props, {
259
259
  onReady?: ((graph: Graph) => any) | undefined;
260
260
  "onData-change"?: ((data: DiagramData) => any) | undefined;
261
261
  }>, {
262
- width: string | number;
263
- readonly: boolean;
264
262
  theme: "light" | "dark";
263
+ width: string | number;
265
264
  height: string | number;
266
265
  showToolbar: boolean;
266
+ readonly: boolean;
267
267
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
268
268
  declare const _default: typeof __VLS_export;
269
269
  //#endregion
@@ -1,2 +1,2 @@
1
1
  require(`./chunk.cjs`);const e=require(`./C_Icon2.cjs`),t=require(`./export-helper.cjs`);let n=require(`vue`),r=require(`naive-ui`);const i=[{label:`?`,value:` ? `,type:`logic`,color:`warning`},{label:`:`,value:` : `,type:`logic`,color:`warning`},{label:`and`,value:` AND `,type:`logic`,color:`warning`},{label:`or`,value:` OR `,type:`logic`,color:`warning`},{label:`(`,value:`(`,type:`paren`},{label:`)`,value:`)`,type:`paren`},{label:`,`,value:`, `,type:`paren`},{label:`==`,value:` == `,type:`compare`},{label:`>`,value:` > `,type:`compare`},{label:`<`,value:` < `,type:`compare`},{label:`≥`,value:` >= `,type:`compare`},{label:`≤`,value:` <= `,type:`compare`},{label:`≠`,value:` != `,type:`compare`},{label:`%`,value:` % `,type:`operator`}],a=[{label:`1`,value:`1`,type:`number`},{label:`2`,value:`2`,type:`number`},{label:`3`,value:`3`,type:`number`},{label:`+`,value:` + `,type:`operator`,color:`primary`},{label:`−`,value:` - `,type:`operator`,color:`primary`},{label:`4`,value:`4`,type:`number`},{label:`5`,value:`5`,type:`number`},{label:`6`,value:`6`,type:`number`},{label:`×`,value:` * `,type:`operator`,color:`primary`},{label:`÷`,value:` / `,type:`operator`,color:`primary`},{label:`7`,value:`7`,type:`number`},{label:`8`,value:`8`,type:`number`},{label:`9`,value:`9`,type:`number`},{label:`0`,value:`0`,type:`number`},{label:`.`,value:`.`,type:`number`}],o=[{label:`⌫`,value:`BACKSPACE`,type:`action`,isAction:!0},{label:`清空`,value:`CLEAR`,type:`action`,isAction:!0}],s=[{name:`IF`,signature:`IF(条件, 真值, 假值)`,description:`根据条件返回不同的值`,category:`逻辑`},{name:`AND`,signature:`AND(条件1, 条件2)`,description:`全部条件为真时返回真`,category:`逻辑`},{name:`OR`,signature:`OR(条件1, 条件2)`,description:`任一条件为真时返回真`,category:`逻辑`},{name:`NOT`,signature:`NOT(条件)`,description:`对条件取反`,category:`逻辑`},{name:`SUM`,signature:`SUM(值1, 值2, ...)`,description:`计算所有值的总和`,category:`数学`},{name:`AVG`,signature:`AVG(值1, 值2, ...)`,description:`计算所有值的平均值`,category:`数学`},{name:`MAX`,signature:`MAX(值1, 值2, ...)`,description:`返回最大值`,category:`数学`},{name:`MIN`,signature:`MIN(值1, 值2, ...)`,description:`返回最小值`,category:`数学`},{name:`ABS`,signature:`ABS(数值)`,description:`返回绝对值`,category:`数学`},{name:`ROUND`,signature:`ROUND(数值, 小数位)`,description:`四舍五入到指定小数位`,category:`数学`},{name:`CEIL`,signature:`CEIL(数值)`,description:`向上取整`,category:`数学`},{name:`FLOOR`,signature:`FLOOR(数值)`,description:`向下取整`,category:`数学`}],c=new Set([`+`,`-`,`*`,`/`,`%`,`>`,`<`,`>=`,`<=`,`==`,`!=`,`?`,`:`,`AND`,`OR`,`NOT`]),l=new Set([`+`,`-`,`*`,`/`,`%`,`>`,`<`,`>=`,`<=`,`==`,`!=`,`?`,`:`,`AND`,`OR`]),u=1e4,d=5e3,f=Object.freeze({IF:(e,t,n)=>e?t:n,AND:(...e)=>e.every(Boolean),OR:(...e)=>e.some(Boolean),NOT:e=>!e,SUM:(...e)=>e.reduce((e,t)=>e+p(t),0),AVG:(...e)=>e.length?e.reduce((e,t)=>e+p(t),0)/e.length:0,MAX:(...e)=>Math.max(...e.map(p)),MIN:(...e)=>Math.min(...e.map(p)),ABS:e=>Math.abs(p(e)),ROUND:(e,t=0)=>{let n=10**Math.min(100,Math.max(0,Math.trunc(p(t))));return Math.round(p(e)*n)/n},CEIL:e=>Math.ceil(p(e)),FLOOR:e=>Math.floor(p(e))});function p(e){let t=Number(e);if(!Number.isFinite(t))throw Error(`无法将“${String(e)}”转换为有限数值`);return t}function m(e){if(e.length>u)throw Error(`公式长度不能超过 ${u} 个字符`);let t=[],n=0,r=e=>{if(t.push(e),t.length>d)throw Error(`公式不能超过 ${d} 个词元`)};for(;n<e.length;){let t=e[n];if(/\s/.test(t)){n+=1;continue}let i=e.slice(n),a=/^(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?/i.exec(i);if(a){r({type:`number`,value:a[0],position:n}),n+=a[0].length;continue}if(t===`[`){let t=e.indexOf(`]`,n+1);if(t===-1)throw Error(`第 ${n+1} 个字符处缺少 ]`);let i=e.slice(n+1,t).trim();if(!i)throw Error(`第 ${n+1} 个字符处的变量名不能为空`);r({type:`variable`,value:i,position:n}),n=t+1;continue}if(t===`"`||t===`'`){let i=t,a=n,o=``,s=!1;for(n+=1;n<e.length;){let t=e[n];if(t===i){s=!0,n+=1;break}if(t===`\\`){if(n+=1,n>=e.length)break;let t=e[n];o+={n:`
2
- `,r:`\r`,t:` `}[t]??t}else o+=t;n+=1}if(!s)throw Error(`第 ${a+1} 个字符处的字符串未闭合`);r({type:`string`,value:o,position:a});continue}let o=e.slice(n,n+2);if([`>=`,`<=`,`==`,`!=`].includes(o)){r({type:`operator`,value:o,position:n}),n+=2;continue}if(`+-*/%><?:`.includes(t)){r({type:`operator`,value:t,position:n}),n+=1;continue}if(`(),`.includes(t)){r({type:`punctuation`,value:t,position:n}),n+=1;continue}let s=/^[A-Za-z_][A-Za-z0-9_]*/.exec(i);if(s){let e=s[0],t=e.toUpperCase();r({type:[`AND`,`OR`,`NOT`].includes(t)?`operator`:`identifier`,value:[`AND`,`OR`,`NOT`].includes(t)?t:e,position:n}),n+=e.length;continue}throw Error(`第 ${n+1} 个字符“${t}”不受支持`)}return t.push({type:`eof`,value:``,position:n}),t}var h=class{cursor=0;nestingDepth=0;constructor(e){this.tokens=e}parse(){let e=this.parseConditional();return this.expect(`eof`),e}current(){return this.tokens[this.cursor]}advance(){return this.tokens[this.cursor++]}consume(e){return this.current().value===e?(this.advance(),!0):!1}expect(e,t){let n=this.current();if(n.type!==e||t!==void 0&&n.value!==t)throw Error(`第 ${n.position+1} 个字符处应为 ${t??e}`);return this.advance()}parseConditional(){if(++this.nestingDepth>100)throw Error(`公式嵌套不能超过 100 层`);try{let e=this.parseOr();if(!this.consume(`?`))return e;let t=this.parseConditional();return this.expect(`operator`,`:`),{kind:`conditional`,condition:e,truthy:t,falsy:this.parseConditional()}}finally{this.nestingDepth--}}parseBinary(e,t){let n=e();for(;t.includes(this.current().value);)n={kind:`binary`,operator:this.advance().value,left:n,right:e()};return n}parseOr(){return this.parseBinary(()=>this.parseAnd(),[`OR`])}parseAnd(){return this.parseBinary(()=>this.parseEquality(),[`AND`])}parseEquality(){return this.parseBinary(()=>this.parseComparison(),[`==`,`!=`])}parseComparison(){return this.parseBinary(()=>this.parseAdditive(),[`>`,`>=`,`<`,`<=`])}parseAdditive(){return this.parseBinary(()=>this.parseMultiplicative(),[`+`,`-`])}parseMultiplicative(){return this.parseBinary(()=>this.parseUnary(),[`*`,`/`,`%`])}parseUnary(){let e=[];for(;[`-`,`+`,`NOT`].includes(this.current().value)&&!(this.current().value===`NOT`&&this.tokens[this.cursor+1]?.value===`(`);)if(e.push(this.advance().value),e.length>100)throw Error(`一元运算不能超过 100 层`);let t=this.parsePrimary();for(let n of e.reverse())t={kind:`unary`,operator:n,value:t};return t}parsePrimary(){let e=this.current();if(e.type===`number`||e.type===`string`)return this.advance(),{kind:`literal`,value:e.type===`number`?Number(e.value):e.value};if(e.type===`variable`)return this.advance(),{kind:`variable`,name:e.value};if(e.type===`identifier`||e.type===`operator`&&[`AND`,`OR`,`NOT`].includes(e.value)){this.advance();let t=e.value.toUpperCase();if(t===`TRUE`||t===`FALSE`)return{kind:`literal`,value:t===`TRUE`};if(this.consume(`(`))return this.parseFunction(t,e);if(t===`NOT`)return{kind:`unary`,operator:`NOT`,value:this.parseUnary()};if(e.type===`identifier`)return{kind:`identifier`,name:e.value}}if(this.consume(`(`)){let e=this.parseConditional();return this.expect(`punctuation`,`)`),e}throw Error(`第 ${e.position+1} 个字符处缺少有效值`)}parseFunction(e,t){if(!Object.prototype.hasOwnProperty.call(f,e))throw Error(`第 ${t.position+1} 个字符处:未知函数“${t.value}”`);let n=[];if(!this.consume(`)`)){do n.push(this.parseConditional());while(this.consume(`,`));this.expect(`punctuation`,`)`)}let[r,i]=e===`IF`?[3,3]:e===`ROUND`?[1,2]:[`AND`,`OR`,`SUM`,`AVG`,`MAX`,`MIN`].includes(e)?[1,1/0]:[1,1];if(n.length<r||n.length>i)throw Error(`第 ${t.position+1} 个字符处:${e} 需要 ${r===i?r:`${r}–${i===1/0?`多个`:i}`} 个参数`);return{kind:`call`,name:e,args:n}}};function g(e,t){if(!Object.prototype.hasOwnProperty.call(t,e)||t[e]==null)throw Error(`变量“${e}”缺少样例数据`);let n=t[e];if(![`number`,`string`,`boolean`].includes(typeof n)||typeof n==`number`&&!Number.isFinite(n))throw Error(`变量“${e}”的数据类型不受支持`);return n}function _(e,t,n){switch(e){case`==`:return t===n;case`!=`:return t!==n;case`+`:return p(t)+p(n);case`-`:return p(t)-p(n);case`*`:return p(t)*p(n);case`/`:return p(t)/p(n);case`%`:return p(t)%p(n);default:if(typeof t==`boolean`||typeof n==`boolean`)throw Error(`运算符 ${e} 不支持布尔值`);return e===`>`?t>n:e===`>=`?t>=n:e===`<`?t<n:t<=n}}function v(e,t,n,r=0){if(r>200)throw Error(`公式计算层数超过安全限制`);let i=e=>v(e,t,n,r+1);switch(e.kind){case`literal`:return e.value;case`variable`:{let r=t.get(e.name);if(!r)throw Error(`未知变量“${e.name}”`);return g(r,n)}case`identifier`:return g(e.name,n);case`conditional`:return i(e.condition)?i(e.truthy):i(e.falsy);case`unary`:{let t=i(e.value);return e.operator===`NOT`?!t:e.operator===`-`?-p(t):p(t)}case`binary`:{let t=i(e.left);return e.operator===`AND`?!!t&&!!i(e.right):e.operator===`OR`?!!t||!!i(e.right):_(e.operator,t,i(e.right))}case`call`:return e.name===`IF`?i(e.args[0])?i(e.args[1]):i(e.args[2]):e.name===`AND`?e.args.every(e=>!!i(e)):e.name===`OR`?e.args.some(e=>!!i(e)):f[e.name](...e.args.map(i))}}function y(e){let t=m(e),n=new h(t).parse();return{tokens:t,evaluate(e,t){let r=v(n,e,t);if(typeof r==`number`&&!Number.isFinite(r))throw Error(`公式计算结果必须是有限数值`);return r}}}function b(e){return m(e)}function x(e,t){let r=(0,n.computed)(()=>new Set(e.value.map(e=>e.name))),i=(0,n.computed)(()=>new Set(e.value.map(e=>e.field))),a=(0,n.computed)(()=>new Set(t.value.map(e=>e.name.toUpperCase()))),o=null;function s(e){try{let t=b(e),n=[],r=0;return t.forEach((i,a)=>{if(i.type===`eof`)return;i.position>r&&n.push({type:`space`,value:e.slice(r,i.position),start:r,end:i.position});let o=e.slice(i.position,t[a+1]?.position??e.length).trimEnd();r=i.position+o.length;let s=t[a+1],c=i.type===`variable`?`variable`:i.type===`number`?`number`:s?.value===`(`&&(i.type===`identifier`||[`AND`,`OR`,`NOT`].includes(i.value))?`function`:i.type===`operator`?`operator`:i.type===`punctuation`?i.value===`,`?`comma`:`paren`:`text`;n.push({type:c,value:c===`variable`?i.value:o,start:i.position,end:r})}),r<e.length&&n.push({type:`space`,value:e.slice(r),start:r,end:e.length}),n}catch{return e?[{type:`text`,value:e,start:0,end:e.length}]:[]}}function c(e){let t=r.value,n=i.value,c=a.value;if(o?.formula===e&&o.names===t&&o.fields===n&&o.functions===c)return o.analysis;let l={tokens:s(e),validation:{valid:!0,message:e.trim()?`语法校验通过`:`尚未输入公式`},compiled:null};if(e.trim())try{l.compiled=y(e);for(let e of l.tokens){if(e.type===`variable`&&!t.has(e.value))throw Error(`第 ${e.start+1} 个字符处:未知变量「${e.value}」`);if(e.type===`function`&&!c.has(e.value.toUpperCase()))throw Error(`第 ${e.start+1} 个字符处:未知函数「${e.value}」`);if(e.type===`text`&&/^[A-Za-z_]\w*$/.test(e.value)&&![`TRUE`,`FALSE`].includes(e.value.toUpperCase())&&!n.has(e.value))throw Error(`第 ${e.start+1} 个字符处:未知字段「${e.value}」`)}}catch(e){let t=e instanceof Error?e.message:String(e),n=/第 (\d+) 个字符/.exec(t);l.validation={valid:!1,message:t,...n?{position:Number(n[1])-1}:{}},l.compiled=null}return o={formula:e,names:t,fields:n,functions:c,analysis:l},l}function l(e){return c(e).validation}function u(e,t){let n=0,r=``;for(let i of s(e).filter(e=>e.type===`variable`))r+=e.slice(n,i.start)+(t.get(i.value)??`__unknown_${i.value}__`),n=i.end;return r+e.slice(n)}return{tokenize:s,analyze:c,validate:l,toEvalExpression:u,variableNames:r,functionNames:a}}function ee(e){let t=(0,n.computed)(()=>({variables:e.config?.variables??e.variables??[],functions:e.config?.functions??e.functions??s,sampleData:e.config?.sampleData??e.sampleData??{},disabled:e.config?.disabled??e.disabled??!1,placeholder:e.config?.placeholder??e.placeholder??`例如:[完成值] / [目标值] * 100`,height:e.config?.height??e.height??`auto`,showPreview:e.config?.showPreview??e.showPreview??!0,showKeyboard:e.config?.showKeyboard??e.showKeyboard??!0,showVariablePanel:e.config?.showVariablePanel??e.showVariablePanel??!0,editableSampleData:e.config?.editableSampleData??e.editableSampleData??!0,templates:e.config?.templates??e.templates??[]})),r=e.modelValue??``,i=(0,n.ref)(r),a=(0,n.ref)({}),o=x((0,n.computed)(()=>t.value.variables),(0,n.computed)(()=>t.value.functions)),c=(0,n.computed)(()=>o.analyze(i.value)),l=(0,n.computed)(()=>{let e=new Map(Object.entries(t.value.sampleData));for(let[t,n]of Object.entries(a.value))n===null?e.delete(t):e.set(t,n);return Object.fromEntries(e)}),u=(0,n.computed)(()=>new Map(t.value.variables.map(e=>[e.name,e.field]))),d=(0,n.computed)(()=>{let e=c.value.tokens.filter(e=>e.type===`variable`).map(e=>e.value),n=c.value.tokens.filter(e=>e.type===`text`).map(e=>e.value);return t.value.variables.filter(t=>e.includes(t.name)||n.includes(t.field)).map(e=>({...e,value:l.value[e.field]}))}),f=(0,n.computed)(()=>{if(!c.value.validation.valid)return{success:!1,result:void 0,error:c.value.validation.message};if(!c.value.compiled)return{success:!0,result:void 0};try{return{success:!0,result:c.value.compiled.evaluate(u.value,l.value)}}catch(e){return{success:!1,result:void 0,error:e instanceof Error?e.message:String(e)}}});function p(e,n){!t.value.disabled&&t.value.editableSampleData&&(a.value={...a.value,[e]:n})}function m(){i.value=r,a.value={}}return(0,n.watch)(()=>e.modelValue,e=>{e!==void 0&&e!==i.value&&(i.value=e)}),(0,n.watch)(()=>t.value.sampleData,()=>{a.value={}}),{options:t,formula:i,analysis:c,evalResult:f,usedVariables:d,updateSample:p,reset:m}}const S={class:`formula-input__header`},C=[`readonly`,`aria-invalid`,`placeholder`],w={key:0,class:`formula-input__tokens`,"aria-label":`公式结构预览`},T=(0,n.defineComponent)({name:`FormulaInput`,__name:`FormulaInput`,props:{formula:{},tokens:{},validation:{},variableNames:{},disabled:{type:Boolean,default:!1},placeholder:{default:`例如:[完成值] / [目标值] * 100`}},emits:[`update:formula`],setup(e,{expose:t,emit:r}){let i=e,a=r,o=(0,n.ref)(),s=(0,n.ref)(i.formula),c=`formula-feedback-${(0,n.useId)()}`,l=s.value.length,u=l;(0,n.watch)(s,e=>a(`update:formula`,e),{flush:`sync`}),(0,n.watch)(()=>i.formula,e=>{e!==s.value&&(s.value=e,l=u=e.length)});function d(){o.value&&(l=o.value.selectionStart,u=o.value.selectionEnd)}function f(e,t=l,r=u){if(i.disabled)return;let a=Math.max(0,Math.min(t,s.value.length));s.value=s.value.slice(0,a)+e+s.value.slice(Math.max(a,r)),l=u=a+e.length,(0,n.nextTick)(()=>{o.value?.focus({preventScroll:!0}),o.value?.setSelectionRange(l,u)})}function p(e){f(e)}function m(){if(l!==u){f(``);return}if(l===0)return;let e=i.tokens.find(e=>e.type===`variable`&&e.end===l),t=Array.from(s.value.slice(0,l)).pop()?.length??1;f(``,e?.start??l-t,u)}function h(){f(``,0,s.value.length)}function g(){l=u=s.value.length,o.value?.setSelectionRange(l,u)}function _(){o.value?.focus({preventScroll:!0}),g()}function v(){let e=i.validation.position??0;o.value?.focus({preventScroll:!0}),o.value?.setSelectionRange(e,Math.min(e+1,s.value.length)),d()}return t({insertAtCursor:p,backspace:m,focus:_,moveCursorToEnd:g}),(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{class:(0,n.normalizeClass)([`formula-input`,{"formula-input--disabled":e.disabled,"formula-input--error":!e.validation.valid&&e.formula.trim()}])},[(0,n.createElementVNode)(`div`,S,[r[1]||=(0,n.createElementVNode)(`span`,{class:`formula-input__label`},`01 / 编辑公式`,-1),e.formula.trim()&&!e.disabled?((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:0,type:`button`,class:`formula-input__clear`,onClick:h},`清空公式`)):(0,n.createCommentVNode)(`v-if`,!0)]),(0,n.withDirectives)((0,n.createElementVNode)(`textarea`,{ref_key:`editorRef`,ref:o,"onUpdate:modelValue":r[0]||=e=>s.value=e,class:`formula-input__editor`,readonly:e.disabled,"aria-label":`公式输入`,"aria-invalid":!e.validation.valid&&!!e.formula.trim(),"aria-describedby":c,placeholder:e.placeholder,spellcheck:`false`,onSelect:d,onClick:d,onKeyup:d,onBlur:d},null,40,C),[[n.vModelText,s.value]]),e.tokens.length?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,w,[r[2]||=(0,n.createElementVNode)(`span`,{class:`formula-input__tokens-label`},`结构预览`,-1),((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(e.tokens,(e,t)=>((0,n.openBlock)(),(0,n.createElementBlock)(`span`,{key:t,class:(0,n.normalizeClass)(`formula-token formula-token--${e.type}`)},(0,n.toDisplayString)(e.type===`variable`?`[${e.value}]`:e.value),3))),128))])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createElementVNode)(`div`,{id:c,class:`formula-input__validation`,role:`status`},[(0,n.createElementVNode)(`span`,{class:(0,n.normalizeClass)(e.formula.trim()?e.validation.valid?`formula-input__validation-success`:`formula-input__validation-error`:`formula-input__validation-hint`)},(0,n.toDisplayString)(e.formula.trim()?e.validation.valid?`语法校验通过,可在右侧调整数据试算。`:e.validation.message:`点击左侧变量开始,也可以直接输入 [变量名]。`),3),e.validation.position===void 0?(0,n.createCommentVNode)(`v-if`,!0):((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:0,type:`button`,class:`formula-input__locate`,onClick:v},`定位错误`))])],2))}});var E=t.t(T,[[`__scopeId`,`data-v-6bf933c2`]]);const D={class:`variable-panel`},O={class:`variable-panel__tabs`},k=[`aria-pressed`],A=[`aria-pressed`],j={class:`variable-panel__search`},M=[`aria-expanded`,`onClick`],N={class:`variable-panel__items`},P=[`disabled`,`onClick`],F={key:0},I=[`disabled`,`onClick`],L={class:`variable-panel__func-name`},R={class:`variable-panel__func-desc`},z={class:`variable-panel__func-sig`},B=(0,n.defineComponent)({__name:`VariablePanel`,props:{variables:{},functions:{},disabled:{type:Boolean}},emits:[`select-variable`,`select-function`],setup(t){let i=t,a=(0,n.ref)(`variable`),o=(0,n.ref)(``),s=(0,n.ref)(new Set),c=(0,n.computed)(()=>{let e=o.value.toLowerCase(),t=e?i.variables.filter(t=>t.name.toLowerCase().includes(e)||t.field.toLowerCase().includes(e)||(t.description??``).toLowerCase().includes(e)):i.variables,n=new Map;for(let e of t){let t=e.group??`其他`,r=n.get(t);r?r.push(e):n.set(t,[e])}return Array.from(n,([e,t])=>({name:e,items:t}))});(0,n.watch)(c,e=>{for(let t of e)s.value.add(t.name)},{immediate:!0});function l(e){s.value.has(e)?s.value.delete(e):s.value.add(e)}let u=(0,n.computed)(()=>{let e=o.value.toLowerCase();return e?i.functions.filter(t=>t.name.toLowerCase().includes(e)||t.description.toLowerCase().includes(e)):i.functions});function d(e){switch(e){case`number`:return`mdi:numeric`;case`text`:return`mdi:format-text`;case`boolean`:return`mdi:toggle-switch-outline`;default:return`mdi:variable`}}return(i,f)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,D,[(0,n.createCommentVNode)(` 切换 Tab:变量 / 函数 `),(0,n.createElementVNode)(`div`,O,[(0,n.createElementVNode)(`button`,{type:`button`,class:(0,n.normalizeClass)([`variable-panel__tab`,{"variable-panel__tab--active":a.value===`variable`}]),"aria-pressed":a.value===`variable`,onClick:f[0]||=e=>a.value=`variable`},` 可用变量 `,10,k),(0,n.createElementVNode)(`button`,{type:`button`,class:(0,n.normalizeClass)([`variable-panel__tab`,{"variable-panel__tab--active":a.value===`function`}]),"aria-pressed":a.value===`function`,onClick:f[1]||=e=>a.value=`function`},` 常用函数 `,10,A)]),(0,n.createCommentVNode)(` 搜索框 `),(0,n.createElementVNode)(`div`,j,[(0,n.createVNode)((0,n.unref)(r.NInput),{value:o.value,"onUpdate:value":f[2]||=e=>o.value=e,size:`small`,placeholder:`搜索变量或函数`,"input-props":{"aria-label":`搜索变量或函数`},clearable:``},{prefix:(0,n.withCtx)(()=>[(0,n.createVNode)(e.t,{name:`mdi:magnify`,size:16})]),_:1},8,[`value`])]),(0,n.createCommentVNode)(` 变量列表 `),a.value===`variable`?((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.NScrollbar),{key:0,class:`variable-panel__list`},{default:(0,n.withCtx)(()=>[c.value.length>0?((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,{key:0},(0,n.renderList)(c.value,r=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:r.name,class:`variable-panel__group`},[(0,n.createElementVNode)(`button`,{type:`button`,class:`variable-panel__group-title`,"aria-expanded":s.value.has(r.name),onClick:e=>l(r.name)},[(0,n.createVNode)(e.t,{name:s.value.has(r.name)?`mdi:chevron-down`:`mdi:chevron-right`,size:16},null,8,[`name`]),(0,n.createTextVNode)(` `+(0,n.toDisplayString)(r.name),1)],8,M),(0,n.withDirectives)((0,n.createElementVNode)(`div`,N,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(r.items,r=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:r.field,type:`button`,class:`variable-panel__item`,disabled:t.disabled,onClick:e=>i.$emit(`select-variable`,r)},[(0,n.createVNode)(e.t,{name:d(r.type),size:15,class:`variable-panel__item-icon`},null,8,[`name`]),(0,n.createElementVNode)(`span`,null,[(0,n.createTextVNode)((0,n.toDisplayString)(r.name),1),r.description?((0,n.openBlock)(),(0,n.createElementBlock)(`small`,F,(0,n.toDisplayString)(r.description),1)):(0,n.createCommentVNode)(`v-if`,!0)])],8,P))),128))],512),[[n.vShow,s.value.has(r.name)]])]))),128)):((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.NEmpty),{key:1,size:`small`,description:`无匹配变量`}))]),_:1})):((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,{key:1},[(0,n.createCommentVNode)(` 函数列表 `),(0,n.createVNode)((0,n.unref)(r.NScrollbar),{class:`variable-panel__list`},{default:(0,n.withCtx)(()=>[u.value.length>0?((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,{key:0},(0,n.renderList)(u.value,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e.name,type:`button`,class:`variable-panel__func`,disabled:t.disabled,onClick:t=>i.$emit(`select-function`,e)},[(0,n.createElementVNode)(`div`,L,[f[3]||=(0,n.createElementVNode)(`span`,{class:`variable-panel__func-badge`},`ƒ`,-1),(0,n.createTextVNode)(` `+(0,n.toDisplayString)(e.name),1)]),(0,n.createElementVNode)(`div`,R,(0,n.toDisplayString)(e.description),1),(0,n.createElementVNode)(`div`,z,(0,n.toDisplayString)(e.signature),1)],8,I))),128)):((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.NEmpty),{key:1,size:`small`,description:`无匹配函数`}))]),_:1})],2112))]))}});var V=t.t(B,[[`__scopeId`,`data-v-2d73fec7`]]);const H={class:`vk`},U={class:`vk__body`},W={class:`vk__half vk__half--ops`},G=[`disabled`,`onClick`],te={class:`vk__half vk__half--nums`},K=[`disabled`,`onClick`],q={class:`vk__actions`},J=[`disabled`,`onClick`],Y=(0,n.defineComponent)({__name:`VirtualKeyboard`,props:{disabled:{type:Boolean,default:!1}},emits:[`key-press`,`action`],setup(e){let t=i,r=a,s=o;return(i,a)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,H,[(0,n.createCommentVNode)(` ═══════ 标题行 ═══════ `),a[0]||=(0,n.createElementVNode)(`div`,{class:`vk__title`},`计算公式`,-1),(0,n.createCommentVNode)(` ═══════ 键盘主体:运算符 | 数字 ═══════ `),(0,n.createElementVNode)(`div`,U,[(0,n.createCommentVNode)(` 运算符区 5 列 `),(0,n.createElementVNode)(`div`,W,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)((0,n.unref)(t),t=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:t.value,class:(0,n.normalizeClass)([`vk__key`,[t.color?`vk__key--${t.color}`:``]]),disabled:e.disabled,onClick:e=>i.$emit(`key-press`,t)},(0,n.toDisplayString)(t.label),11,G))),128))]),(0,n.createCommentVNode)(` 数字区 5 列 `),(0,n.createElementVNode)(`div`,te,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)((0,n.unref)(r),t=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:t.label+t.value,class:(0,n.normalizeClass)([`vk__key`,[t.color?`vk__key--${t.color}`:``]]),disabled:e.disabled,onClick:e=>i.$emit(`key-press`,t)},(0,n.toDisplayString)(t.label),11,K))),128))])]),(0,n.createCommentVNode)(` ═══════ 动作行:⌫ + 清空 ═══════ `),(0,n.createElementVNode)(`div`,q,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)((0,n.unref)(s),t=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:t.value,class:`vk__key vk__key--action`,disabled:e.disabled,onClick:e=>i.$emit(`action`,t.value)},(0,n.toDisplayString)(t.label),9,J))),128))])]))}});var X=t.t(Y,[[`__scopeId`,`data-v-8c874c05`]]);const Z={class:`formula-preview`,"aria-label":`公式试算`},Q={class:`formula-preview__result-label`},ne={key:0,class:`formula-preview__result-value`},re={key:1,class:`formula-preview__result-empty`},ie={class:`formula-preview__vars`},ae={class:`formula-preview__vars-title`},oe={class:`formula-preview__var-heading`},se=[`for`],ce={key:3,class:`formula-preview__var-value`},le={key:4},ue={key:0,class:`formula-preview__empty`},de=(0,n.defineComponent)({name:`FormulaPreview`,__name:`FormulaPreview`,props:{formula:{},evalResult:{},usedVariables:{},editable:{type:Boolean}},emits:[`update-value`],setup(e,{emit:t}){let i=t,a=`formula-sample-${(0,n.useId)()}`;function o(e){return typeof e==`number`?new Intl.NumberFormat(void 0,{maximumFractionDigits:6}).format(e):typeof e==`boolean`?e?`真 · true`:`假 · false`:String(e)}return(t,s)=>((0,n.openBlock)(),(0,n.createElementBlock)(`aside`,Z,[s[1]||=(0,n.createElementVNode)(`header`,null,[(0,n.createElementVNode)(`span`,{class:`formula-preview__step`},`02`),(0,n.createElementVNode)(`div`,null,[(0,n.createElementVNode)(`h3`,null,`验证计算结果`),(0,n.createElementVNode)(`p`,null,`调整试算值,观察规则是否符合预期。`)])],-1),(0,n.createElementVNode)(`div`,{class:(0,n.normalizeClass)([`formula-preview__result`,{"formula-preview__result--error":!!e.evalResult.error}]),role:`status`,"aria-live":`polite`},[(0,n.createElementVNode)(`span`,Q,(0,n.toDisplayString)(e.evalResult.error?`暂时无法计算`:`试算结果`),1),e.evalResult.success&&e.evalResult.result!==void 0?((0,n.openBlock)(),(0,n.createElementBlock)(`output`,ne,(0,n.toDisplayString)(o(e.evalResult.result)),1)):((0,n.openBlock)(),(0,n.createElementBlock)(`span`,re,(0,n.toDisplayString)(e.formula.trim()?e.evalResult.error||`等待数据`:`输入公式后展示结果`),1))],2),(0,n.createElementVNode)(`div`,ie,[(0,n.createElementVNode)(`div`,ae,[s[0]||=(0,n.createTextVNode)(`本次使用的试算值 `,-1),(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(e.usedVariables.length)+` 项`,1)]),((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(e.usedVariables,t=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:t.field,class:`formula-preview__var-row`},[(0,n.createElementVNode)(`div`,oe,[(0,n.createElementVNode)(`label`,{for:`${a}-${t.field}`},(0,n.toDisplayString)(t.name),9,se),(0,n.createElementVNode)(`code`,null,(0,n.toDisplayString)(t.field),1)]),e.editable&&t.type===`number`?((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.NInputNumber),{key:0,value:typeof t.value==`number`?t.value:null,"input-props":{id:`${a}-${t.field}`,"aria-label":`试算值:${t.name}`},placeholder:`请输入数值`,"onUpdate:value":e=>i(`update-value`,t.field,e)},null,8,[`value`,`input-props`,`onUpdate:value`])):e.editable&&t.type===`boolean`?((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.NSwitch),{key:1,value:t.value===!0,"aria-label":`试算值:${t.name}`,"onUpdate:value":e=>i(`update-value`,t.field,e)},null,8,[`value`,`aria-label`,`onUpdate:value`])):e.editable&&t.type===`text`?((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.NInput),{key:2,value:typeof t.value==`string`?t.value:``,"input-props":{id:`${a}-${t.field}`,"aria-label":`试算值:${t.name}`},"onUpdate:value":e=>i(`update-value`,t.field,e)},null,8,[`value`,`input-props`,`onUpdate:value`])):((0,n.openBlock)(),(0,n.createElementBlock)(`span`,ce,(0,n.toDisplayString)(t.value??`未提供`),1)),t.description?((0,n.openBlock)(),(0,n.createElementBlock)(`p`,le,(0,n.toDisplayString)(t.description),1)):(0,n.createCommentVNode)(`v-if`,!0)]))),128)),e.usedVariables.length?(0,n.createCommentVNode)(`v-if`,!0):((0,n.openBlock)(),(0,n.createElementBlock)(`p`,ue,(0,n.toDisplayString)(e.formula.trim()?`当前公式没有引用变量。`:`引用变量后,对应数据会出现在这里。`),1))]),s[2]||=(0,n.createElementVNode)(`p`,{class:`formula-preview__note`},`试算值仅用于本次验证,修改不会写入业务数据。`,-1)]))}});var fe=t.t(de,[[`__scopeId`,`data-v-b2656900`]]);const pe={class:`c-formula__title-row`},$={class:`c-formula__actions`},me={key:0,class:`c-formula__templates`,"aria-label":`公式模板`},he=[`disabled`,`aria-pressed`,`onClick`],ge={key:0,class:`c-formula__sidebar`},_e={class:`c-formula__main`},ve={key:0,class:`c-formula__keyboard`},ye={class:`c-formula__guide`},be=(0,n.defineComponent)({name:`C_FormulaEditor`,__name:`index`,props:{modelValue:{},config:{},variables:{},functions:{},sampleData:{},disabled:{type:Boolean,default:!1},placeholder:{},height:{},showPreview:{type:Boolean,default:!0},showKeyboard:{type:Boolean,default:!0},showVariablePanel:{type:Boolean,default:!0},editableSampleData:{type:Boolean,default:!0},templates:{}},emits:[`update:modelValue`,`change`,`validation-change`],setup(t,{expose:i,emit:a}){let o=t,s=a,{options:c,formula:l,analysis:u,evalResult:d,usedVariables:f,updateSample:p,reset:m}=ee(o),h=(0,n.ref)();(0,n.watch)(l,e=>{s(`update:modelValue`,e),s(`change`,e)}),(0,n.watch)(()=>u.value.validation,e=>s(`validation-change`,e),{immediate:!0});function g(e){c.value.disabled||(l.value=e)}function _(e){c.value.disabled||h.value?.insertAtCursor(e)}function v(e){c.value.disabled||(e===`BACKSPACE`&&h.value?.backspace(),e===`CLEAR`&&(l.value=``))}return i({getValue:()=>l.value,setValue:e=>{l.value=e},reset:m,validate:()=>u.value.validation,insertAtCursor:_,focus:()=>h.value?.focus()}),(t,i)=>((0,n.openBlock)(),(0,n.createElementBlock)(`section`,{class:`c-formula`,style:(0,n.normalizeStyle)({height:typeof(0,n.unref)(c).height==`number`?`${(0,n.unref)(c).height}px`:(0,n.unref)(c).height}),"aria-label":`公式编辑器`},[(0,n.createElementVNode)(`header`,pe,[i[4]||=(0,n.createElementVNode)(`div`,null,[(0,n.createElementVNode)(`span`,{class:`c-formula__eyebrow`},`FORMULA WORKBENCH`),(0,n.createElementVNode)(`h2`,null,`规则与试算`),(0,n.createElementVNode)(`p`,null,`插入变量、编辑公式,再用试算值验证结果。`)],-1),(0,n.createElementVNode)(`div`,$,[(0,n.createVNode)((0,n.unref)(r.NTag),{type:(0,n.unref)(l).trim()?(0,n.unref)(u).validation.valid?`success`:`error`:`default`,size:`small`},{default:(0,n.withCtx)(()=>[(0,n.createTextVNode)((0,n.toDisplayString)((0,n.unref)(l).trim()?(0,n.unref)(u).validation.valid?`语法有效`:`需要修正`:`等待输入`),1)]),_:1},8,[`type`]),(0,n.createVNode)((0,n.unref)(r.NButton),{size:`small`,disabled:(0,n.unref)(c).disabled,onClick:(0,n.unref)(m)},{default:(0,n.withCtx)(()=>[...i[3]||=[(0,n.createTextVNode)(`重置`,-1)]]),_:1},8,[`disabled`,`onClick`])])]),(0,n.unref)(c).templates.length?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,me,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)((0,n.unref)(c).templates,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e.value,type:`button`,disabled:(0,n.unref)(c).disabled,"aria-pressed":(0,n.unref)(l)===e.value,onClick:t=>l.value=e.value},[(0,n.createElementVNode)(`strong`,null,(0,n.toDisplayString)(e.label),1),(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(e.description),1)],8,he))),128))])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createElementVNode)(`div`,{class:(0,n.normalizeClass)([`c-formula__body`,{"c-formula__body--no-sidebar":!(0,n.unref)(c).showVariablePanel,"c-formula__body--no-preview":!(0,n.unref)(c).showPreview}])},[(0,n.unref)(c).showVariablePanel?((0,n.openBlock)(),(0,n.createElementBlock)(`aside`,ge,[(0,n.createVNode)(V,{variables:(0,n.unref)(c).variables,functions:(0,n.unref)(c).functions,disabled:(0,n.unref)(c).disabled,onSelectVariable:i[0]||=e=>_(`[${e.name}]`),onSelectFunction:i[1]||=e=>_(`${e.name}(`)},null,8,[`variables`,`functions`,`disabled`])])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createElementVNode)(`div`,_e,[(0,n.createVNode)(E,{ref_key:`formulaInputRef`,ref:h,formula:(0,n.unref)(l),tokens:(0,n.unref)(u).tokens,validation:(0,n.unref)(u).validation,disabled:(0,n.unref)(c).disabled,placeholder:(0,n.unref)(c).placeholder,"onUpdate:formula":g},null,8,[`formula`,`tokens`,`validation`,`disabled`,`placeholder`]),(0,n.unref)(c).showKeyboard?((0,n.openBlock)(),(0,n.createElementBlock)(`details`,ve,[i[5]||=(0,n.createElementVNode)(`summary`,null,[(0,n.createTextVNode)(`辅助键盘 `),(0,n.createElementVNode)(`span`,null,`运算符、数字与退格`)],-1),(0,n.createVNode)(X,{disabled:(0,n.unref)(c).disabled,onKeyPress:i[2]||=e=>_(e.value),onAction:v},null,8,[`disabled`])])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createElementVNode)(`div`,ye,[(0,n.createVNode)(e.t,{name:`mdi:information-outline`,size:16}),i[6]||=(0,n.createElementVNode)(`p`,null,[(0,n.createTextVNode)(`变量使用 `),(0,n.createElementVNode)(`code`,null,`[变量名]`),(0,n.createTextVNode)(`,支持括号、比较和条件函数。右侧结果是当前数据的本地试算。`)],-1)])]),(0,n.unref)(c).showPreview?((0,n.openBlock)(),(0,n.createBlock)(fe,{key:1,formula:(0,n.unref)(l),"eval-result":(0,n.unref)(d),"used-variables":(0,n.unref)(f),editable:(0,n.unref)(c).editableSampleData&&!(0,n.unref)(c).disabled,onUpdateValue:(0,n.unref)(p)},null,8,[`formula`,`eval-result`,`used-variables`,`editable`,`onUpdateValue`])):(0,n.createCommentVNode)(`v-if`,!0)],2)],4))}});var xe=t.t(be,[[`__scopeId`,`data-v-fdb8dd69`]]);function Se(e){let t=(0,n.computed)(()=>{let t=new Map;for(let n of e.value)t.set(n.name,n.field);return t}),r,i;function a(e,n){if(!e.trim())return{success:!0,result:void 0};try{return(!i||r!==e)&&(i=y(e),r=e),{success:!0,result:i.evaluate(t.value,n)}}catch(e){return{success:!1,result:void 0,error:e instanceof Error?e.message:String(e)}}}function o(e){try{return[...new Set(b(e).filter(e=>e.type===`variable`).map(e=>e.value))]}catch{return[]}}return{evaluate:a,extractVariableNames:o,variableMap:t}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return xe}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Se}});
2
+ `,r:`\r`,t:` `}[t]??t}else o+=t;n+=1}if(!s)throw Error(`第 ${a+1} 个字符处的字符串未闭合`);r({type:`string`,value:o,position:a});continue}let o=e.slice(n,n+2);if([`>=`,`<=`,`==`,`!=`].includes(o)){r({type:`operator`,value:o,position:n}),n+=2;continue}if(`+-*/%><?:`.includes(t)){r({type:`operator`,value:t,position:n}),n+=1;continue}if(`(),`.includes(t)){r({type:`punctuation`,value:t,position:n}),n+=1;continue}let s=/^[A-Za-z_][A-Za-z0-9_]*/.exec(i);if(s){let e=s[0],t=e.toUpperCase();r({type:[`AND`,`OR`,`NOT`].includes(t)?`operator`:`identifier`,value:[`AND`,`OR`,`NOT`].includes(t)?t:e,position:n}),n+=e.length;continue}throw Error(`第 ${n+1} 个字符“${t}”不受支持`)}return t.push({type:`eof`,value:``,position:n}),t}var h=class{cursor=0;nestingDepth=0;constructor(e){this.tokens=e}parse(){let e=this.parseConditional();return this.expect(`eof`),e}current(){return this.tokens[this.cursor]}advance(){return this.tokens[this.cursor++]}consume(e){return this.current().value===e?(this.advance(),!0):!1}expect(e,t){let n=this.current();if(n.type!==e||t!==void 0&&n.value!==t)throw Error(`第 ${n.position+1} 个字符处应为 ${t??e}`);return this.advance()}parseConditional(){if(++this.nestingDepth>100)throw Error(`公式嵌套不能超过 100 层`);try{let e=this.parseOr();if(!this.consume(`?`))return e;let t=this.parseConditional();return this.expect(`operator`,`:`),{kind:`conditional`,condition:e,truthy:t,falsy:this.parseConditional()}}finally{this.nestingDepth--}}parseBinary(e,t){let n=e();for(;t.includes(this.current().value);)n={kind:`binary`,operator:this.advance().value,left:n,right:e()};return n}parseOr(){return this.parseBinary(()=>this.parseAnd(),[`OR`])}parseAnd(){return this.parseBinary(()=>this.parseEquality(),[`AND`])}parseEquality(){return this.parseBinary(()=>this.parseComparison(),[`==`,`!=`])}parseComparison(){return this.parseBinary(()=>this.parseAdditive(),[`>`,`>=`,`<`,`<=`])}parseAdditive(){return this.parseBinary(()=>this.parseMultiplicative(),[`+`,`-`])}parseMultiplicative(){return this.parseBinary(()=>this.parseUnary(),[`*`,`/`,`%`])}parseUnary(){let e=[];for(;[`-`,`+`,`NOT`].includes(this.current().value)&&!(this.current().value===`NOT`&&this.tokens[this.cursor+1]?.value===`(`);)if(e.push(this.advance().value),e.length>100)throw Error(`一元运算不能超过 100 层`);let t=this.parsePrimary();for(let n of e.reverse())t={kind:`unary`,operator:n,value:t};return t}parsePrimary(){let e=this.current();if(e.type===`number`||e.type===`string`)return this.advance(),{kind:`literal`,value:e.type===`number`?Number(e.value):e.value};if(e.type===`variable`)return this.advance(),{kind:`variable`,name:e.value};if(e.type===`identifier`||e.type===`operator`&&[`AND`,`OR`,`NOT`].includes(e.value)){this.advance();let t=e.value.toUpperCase();if(t===`TRUE`||t===`FALSE`)return{kind:`literal`,value:t===`TRUE`};if(this.consume(`(`))return this.parseFunction(t,e);if(t===`NOT`)return{kind:`unary`,operator:`NOT`,value:this.parseUnary()};if(e.type===`identifier`)return{kind:`identifier`,name:e.value}}if(this.consume(`(`)){let e=this.parseConditional();return this.expect(`punctuation`,`)`),e}throw Error(`第 ${e.position+1} 个字符处缺少有效值`)}parseFunction(e,t){if(!Object.prototype.hasOwnProperty.call(f,e))throw Error(`第 ${t.position+1} 个字符处:未知函数“${t.value}”`);let n=[];if(!this.consume(`)`)){do n.push(this.parseConditional());while(this.consume(`,`));this.expect(`punctuation`,`)`)}let[r,i]=e===`IF`?[3,3]:e===`ROUND`?[1,2]:[`AND`,`OR`,`SUM`,`AVG`,`MAX`,`MIN`].includes(e)?[1,1/0]:[1,1];if(n.length<r||n.length>i)throw Error(`第 ${t.position+1} 个字符处:${e} 需要 ${r===i?r:`${r}–${i===1/0?`多个`:i}`} 个参数`);return{kind:`call`,name:e,args:n}}};function g(e,t){if(!Object.prototype.hasOwnProperty.call(t,e)||t[e]==null)throw Error(`变量“${e}”缺少样例数据`);let n=t[e];if(![`number`,`string`,`boolean`].includes(typeof n)||typeof n==`number`&&!Number.isFinite(n))throw Error(`变量“${e}”的数据类型不受支持`);return n}function _(e,t,n){switch(e){case`==`:return t===n;case`!=`:return t!==n;case`+`:return p(t)+p(n);case`-`:return p(t)-p(n);case`*`:return p(t)*p(n);case`/`:return p(t)/p(n);case`%`:return p(t)%p(n);default:if(typeof t==`boolean`||typeof n==`boolean`)throw Error(`运算符 ${e} 不支持布尔值`);return e===`>`?t>n:e===`>=`?t>=n:e===`<`?t<n:t<=n}}function v(e,t,n,r=0){if(r>200)throw Error(`公式计算层数超过安全限制`);let i=e=>v(e,t,n,r+1);switch(e.kind){case`literal`:return e.value;case`variable`:{let r=t.get(e.name);if(!r)throw Error(`未知变量“${e.name}”`);return g(r,n)}case`identifier`:return g(e.name,n);case`conditional`:return i(e.condition)?i(e.truthy):i(e.falsy);case`unary`:{let t=i(e.value);return e.operator===`NOT`?!t:e.operator===`-`?-p(t):p(t)}case`binary`:{let t=i(e.left);return e.operator===`AND`?!!t&&!!i(e.right):e.operator===`OR`?!!t||!!i(e.right):_(e.operator,t,i(e.right))}case`call`:return e.name===`IF`?i(e.args[0])?i(e.args[1]):i(e.args[2]):e.name===`AND`?e.args.every(e=>!!i(e)):e.name===`OR`?e.args.some(e=>!!i(e)):f[e.name](...e.args.map(i))}}function y(e){let t=m(e),n=new h(t).parse();return{tokens:t,evaluate(e,t){let r=v(n,e,t);if(typeof r==`number`&&!Number.isFinite(r))throw Error(`公式计算结果必须是有限数值`);return r}}}function b(e){return m(e)}function x(e,t){let r=(0,n.computed)(()=>new Set(e.value.map(e=>e.name))),i=(0,n.computed)(()=>new Set(e.value.map(e=>e.field))),a=(0,n.computed)(()=>new Set(t.value.map(e=>e.name.toUpperCase()))),o=null;function s(e){try{let t=b(e),n=[],r=0;return t.forEach((i,a)=>{if(i.type===`eof`)return;i.position>r&&n.push({type:`space`,value:e.slice(r,i.position),start:r,end:i.position});let o=e.slice(i.position,t[a+1]?.position??e.length).trimEnd();r=i.position+o.length;let s=t[a+1],c=i.type===`variable`?`variable`:i.type===`number`?`number`:s?.value===`(`&&(i.type===`identifier`||[`AND`,`OR`,`NOT`].includes(i.value))?`function`:i.type===`operator`?`operator`:i.type===`punctuation`?i.value===`,`?`comma`:`paren`:`text`;n.push({type:c,value:c===`variable`?i.value:o,start:i.position,end:r})}),r<e.length&&n.push({type:`space`,value:e.slice(r),start:r,end:e.length}),n}catch{return e?[{type:`text`,value:e,start:0,end:e.length}]:[]}}function c(e){let t=r.value,n=i.value,c=a.value;if(o?.formula===e&&o.names===t&&o.fields===n&&o.functions===c)return o.analysis;let l={tokens:s(e),validation:{valid:!0,message:e.trim()?`语法校验通过`:`尚未输入公式`},compiled:null};if(e.trim())try{l.compiled=y(e);for(let e of l.tokens){if(e.type===`variable`&&!t.has(e.value))throw Error(`第 ${e.start+1} 个字符处:未知变量「${e.value}」`);if(e.type===`function`&&!c.has(e.value.toUpperCase()))throw Error(`第 ${e.start+1} 个字符处:未知函数「${e.value}」`);if(e.type===`text`&&/^[A-Za-z_]\w*$/.test(e.value)&&![`TRUE`,`FALSE`].includes(e.value.toUpperCase())&&!n.has(e.value))throw Error(`第 ${e.start+1} 个字符处:未知字段「${e.value}」`)}}catch(e){let t=e instanceof Error?e.message:String(e),n=/第 (\d+) 个字符/.exec(t);l.validation={valid:!1,message:t,...n?{position:Number(n[1])-1}:{}},l.compiled=null}return o={formula:e,names:t,fields:n,functions:c,analysis:l},l}function l(e){return c(e).validation}function u(e,t){let n=0,r=``;for(let i of s(e).filter(e=>e.type===`variable`))r+=e.slice(n,i.start)+(t.get(i.value)??`__unknown_${i.value}__`),n=i.end;return r+e.slice(n)}return{tokenize:s,analyze:c,validate:l,toEvalExpression:u,variableNames:r,functionNames:a}}function ee(e){let t=(0,n.computed)(()=>({variables:e.config?.variables??e.variables??[],functions:e.config?.functions??e.functions??s,sampleData:e.config?.sampleData??e.sampleData??{},disabled:e.config?.disabled??e.disabled??!1,placeholder:e.config?.placeholder??e.placeholder??`例如:[完成值] / [目标值] * 100`,height:e.config?.height??e.height??`auto`,showPreview:e.config?.showPreview??e.showPreview??!0,showKeyboard:e.config?.showKeyboard??e.showKeyboard??!0,showVariablePanel:e.config?.showVariablePanel??e.showVariablePanel??!0,editableSampleData:e.config?.editableSampleData??e.editableSampleData??!0,templates:e.config?.templates??e.templates??[]})),r=e.modelValue??``,i=(0,n.ref)(r),a=(0,n.ref)({}),o=x((0,n.computed)(()=>t.value.variables),(0,n.computed)(()=>t.value.functions)),c=(0,n.computed)(()=>o.analyze(i.value)),l=(0,n.computed)(()=>{let e=new Map(Object.entries(t.value.sampleData));for(let[t,n]of Object.entries(a.value))n===null?e.delete(t):e.set(t,n);return Object.fromEntries(e)}),u=(0,n.computed)(()=>new Map(t.value.variables.map(e=>[e.name,e.field]))),d=(0,n.computed)(()=>{let e=c.value.tokens.filter(e=>e.type===`variable`).map(e=>e.value),n=c.value.tokens.filter(e=>e.type===`text`).map(e=>e.value);return t.value.variables.filter(t=>e.includes(t.name)||n.includes(t.field)).map(e=>({...e,value:l.value[e.field]}))}),f=(0,n.computed)(()=>{if(!c.value.validation.valid)return{success:!1,result:void 0,error:c.value.validation.message};if(!c.value.compiled)return{success:!0,result:void 0};try{return{success:!0,result:c.value.compiled.evaluate(u.value,l.value)}}catch(e){return{success:!1,result:void 0,error:e instanceof Error?e.message:String(e)}}});function p(e,n){!t.value.disabled&&t.value.editableSampleData&&(a.value={...a.value,[e]:n})}function m(){i.value=r,a.value={}}return(0,n.watch)(()=>e.modelValue,e=>{e!==void 0&&e!==i.value&&(i.value=e)}),(0,n.watch)(()=>t.value.sampleData,()=>{a.value={}}),{options:t,formula:i,analysis:c,evalResult:f,usedVariables:d,updateSample:p,reset:m}}const S={class:`formula-input__header`},C=[`readonly`,`aria-invalid`,`placeholder`],w={key:0,class:`formula-input__tokens`,"aria-label":`公式结构预览`},T=(0,n.defineComponent)({name:`FormulaInput`,__name:`FormulaInput`,props:{formula:{},tokens:{},validation:{},variableNames:{},disabled:{type:Boolean,default:!1},placeholder:{default:`例如:[完成值] / [目标值] * 100`}},emits:[`update:formula`],setup(e,{expose:t,emit:r}){let i=e,a=r,o=(0,n.ref)(),s=(0,n.ref)(i.formula),c=`formula-feedback-${(0,n.useId)()}`,l=s.value.length,u=l;(0,n.watch)(s,e=>a(`update:formula`,e),{flush:`sync`}),(0,n.watch)(()=>i.formula,e=>{e!==s.value&&(s.value=e,l=u=e.length)});function d(){o.value&&(l=o.value.selectionStart,u=o.value.selectionEnd)}function f(e,t=l,r=u){if(i.disabled)return;let a=Math.max(0,Math.min(t,s.value.length));s.value=s.value.slice(0,a)+e+s.value.slice(Math.max(a,r)),l=u=a+e.length,(0,n.nextTick)(()=>{o.value?.focus({preventScroll:!0}),o.value?.setSelectionRange(l,u)})}function p(e){f(e)}function m(){if(l!==u){f(``);return}if(l===0)return;let e=i.tokens.find(e=>e.type===`variable`&&e.end===l),t=Array.from(s.value.slice(0,l)).pop()?.length??1;f(``,e?.start??l-t,u)}function h(){f(``,0,s.value.length)}function g(){l=u=s.value.length,o.value?.setSelectionRange(l,u)}function _(){o.value?.focus({preventScroll:!0}),g()}function v(){let e=i.validation.position??0;o.value?.focus({preventScroll:!0}),o.value?.setSelectionRange(e,Math.min(e+1,s.value.length)),d()}return t({insertAtCursor:p,backspace:m,clear:h,focus:_,moveCursorToEnd:g}),(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{class:(0,n.normalizeClass)([`formula-input`,{"formula-input--disabled":e.disabled,"formula-input--error":!e.validation.valid&&e.formula.trim()}])},[(0,n.createElementVNode)(`div`,S,[r[1]||=(0,n.createElementVNode)(`span`,{class:`formula-input__label`},`01 / 编辑公式`,-1),e.formula.trim()&&!e.disabled?((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:0,type:`button`,class:`formula-input__clear`,onClick:h},`清空公式`)):(0,n.createCommentVNode)(`v-if`,!0)]),(0,n.withDirectives)((0,n.createElementVNode)(`textarea`,{ref_key:`editorRef`,ref:o,"onUpdate:modelValue":r[0]||=e=>s.value=e,class:`formula-input__editor`,readonly:e.disabled,"aria-label":`公式输入`,"aria-invalid":!e.validation.valid&&!!e.formula.trim(),"aria-describedby":c,placeholder:e.placeholder,spellcheck:`false`,onSelect:d,onClick:d,onKeyup:d,onBlur:d},null,40,C),[[n.vModelText,s.value]]),e.tokens.length?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,w,[r[2]||=(0,n.createElementVNode)(`span`,{class:`formula-input__tokens-label`},`结构预览`,-1),((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(e.tokens,(e,t)=>((0,n.openBlock)(),(0,n.createElementBlock)(`span`,{key:t,class:(0,n.normalizeClass)(`formula-token formula-token--${e.type}`)},(0,n.toDisplayString)(e.type===`variable`?`[${e.value}]`:e.value),3))),128))])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createElementVNode)(`div`,{id:c,class:`formula-input__validation`,role:`status`},[(0,n.createElementVNode)(`span`,{class:(0,n.normalizeClass)(e.formula.trim()?e.validation.valid?`formula-input__validation-success`:`formula-input__validation-error`:`formula-input__validation-hint`)},(0,n.toDisplayString)(e.formula.trim()?e.validation.valid?`语法校验通过,可在右侧调整数据试算。`:e.validation.message:`点击左侧变量开始,也可以直接输入 [变量名]。`),3),e.validation.position===void 0?(0,n.createCommentVNode)(`v-if`,!0):((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:0,type:`button`,class:`formula-input__locate`,onClick:v},`定位错误`))])],2))}});var E=t.t(T,[[`__scopeId`,`data-v-5b2f30eb`]]);const D={class:`variable-panel`},O={class:`variable-panel__tabs`},k=[`aria-pressed`],A=[`aria-pressed`],j={class:`variable-panel__search`},M=[`aria-expanded`,`onClick`],N={class:`variable-panel__items`},P=[`disabled`,`onClick`],F={key:0},I=[`disabled`,`onClick`],L={class:`variable-panel__func-name`},R={class:`variable-panel__func-desc`},z={class:`variable-panel__func-sig`},B=(0,n.defineComponent)({__name:`VariablePanel`,props:{variables:{},functions:{},disabled:{type:Boolean}},emits:[`select-variable`,`select-function`],setup(t){let i=t,a=(0,n.ref)(`variable`),o=(0,n.ref)(``),s=(0,n.ref)(new Set),c=(0,n.computed)(()=>{let e=o.value.toLowerCase(),t=e?i.variables.filter(t=>t.name.toLowerCase().includes(e)||t.field.toLowerCase().includes(e)||(t.description??``).toLowerCase().includes(e)):i.variables,n=new Map;for(let e of t){let t=e.group??`其他`,r=n.get(t);r?r.push(e):n.set(t,[e])}return Array.from(n,([e,t])=>({name:e,items:t}))});(0,n.watch)(c,e=>{for(let t of e)s.value.add(t.name)},{immediate:!0});function l(e){s.value.has(e)?s.value.delete(e):s.value.add(e)}let u=(0,n.computed)(()=>{let e=o.value.toLowerCase();return e?i.functions.filter(t=>t.name.toLowerCase().includes(e)||t.description.toLowerCase().includes(e)):i.functions});function d(e){switch(e){case`number`:return`mdi:numeric`;case`text`:return`mdi:format-text`;case`boolean`:return`mdi:toggle-switch-outline`;default:return`mdi:variable`}}return(i,f)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,D,[(0,n.createCommentVNode)(` 切换 Tab:变量 / 函数 `),(0,n.createElementVNode)(`div`,O,[(0,n.createElementVNode)(`button`,{type:`button`,class:(0,n.normalizeClass)([`variable-panel__tab`,{"variable-panel__tab--active":a.value===`variable`}]),"aria-pressed":a.value===`variable`,onClick:f[0]||=e=>a.value=`variable`},` 可用变量 `,10,k),(0,n.createElementVNode)(`button`,{type:`button`,class:(0,n.normalizeClass)([`variable-panel__tab`,{"variable-panel__tab--active":a.value===`function`}]),"aria-pressed":a.value===`function`,onClick:f[1]||=e=>a.value=`function`},` 常用函数 `,10,A)]),(0,n.createCommentVNode)(` 搜索框 `),(0,n.createElementVNode)(`div`,j,[(0,n.createVNode)((0,n.unref)(r.NInput),{value:o.value,"onUpdate:value":f[2]||=e=>o.value=e,size:`small`,placeholder:`搜索变量或函数`,"input-props":{"aria-label":`搜索变量或函数`},clearable:``},{prefix:(0,n.withCtx)(()=>[(0,n.createVNode)(e.t,{name:`mdi:magnify`,size:16})]),_:1},8,[`value`])]),(0,n.createCommentVNode)(` 变量列表 `),a.value===`variable`?((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.NScrollbar),{key:0,class:`variable-panel__list`},{default:(0,n.withCtx)(()=>[c.value.length>0?((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,{key:0},(0,n.renderList)(c.value,r=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:r.name,class:`variable-panel__group`},[(0,n.createElementVNode)(`button`,{type:`button`,class:`variable-panel__group-title`,"aria-expanded":s.value.has(r.name),onClick:e=>l(r.name)},[(0,n.createVNode)(e.t,{name:s.value.has(r.name)?`mdi:chevron-down`:`mdi:chevron-right`,size:16},null,8,[`name`]),(0,n.createTextVNode)(` `+(0,n.toDisplayString)(r.name),1)],8,M),(0,n.withDirectives)((0,n.createElementVNode)(`div`,N,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(r.items,r=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:r.field,type:`button`,class:`variable-panel__item`,disabled:t.disabled,onClick:e=>i.$emit(`select-variable`,r)},[(0,n.createVNode)(e.t,{name:d(r.type),size:15,class:`variable-panel__item-icon`},null,8,[`name`]),(0,n.createElementVNode)(`span`,null,[(0,n.createTextVNode)((0,n.toDisplayString)(r.name),1),r.description?((0,n.openBlock)(),(0,n.createElementBlock)(`small`,F,(0,n.toDisplayString)(r.description),1)):(0,n.createCommentVNode)(`v-if`,!0)])],8,P))),128))],512),[[n.vShow,s.value.has(r.name)]])]))),128)):((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.NEmpty),{key:1,size:`small`,description:`无匹配变量`}))]),_:1})):((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,{key:1},[(0,n.createCommentVNode)(` 函数列表 `),(0,n.createVNode)((0,n.unref)(r.NScrollbar),{class:`variable-panel__list`},{default:(0,n.withCtx)(()=>[u.value.length>0?((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,{key:0},(0,n.renderList)(u.value,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e.name,type:`button`,class:`variable-panel__func`,disabled:t.disabled,onClick:t=>i.$emit(`select-function`,e)},[(0,n.createElementVNode)(`div`,L,[f[3]||=(0,n.createElementVNode)(`span`,{class:`variable-panel__func-badge`},`ƒ`,-1),(0,n.createTextVNode)(` `+(0,n.toDisplayString)(e.name),1)]),(0,n.createElementVNode)(`div`,R,(0,n.toDisplayString)(e.description),1),(0,n.createElementVNode)(`div`,z,(0,n.toDisplayString)(e.signature),1)],8,I))),128)):((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.NEmpty),{key:1,size:`small`,description:`无匹配函数`}))]),_:1})],2112))]))}});var V=t.t(B,[[`__scopeId`,`data-v-2d73fec7`]]);const H={class:`virtual-keyboard`,role:`group`,"aria-label":`公式键盘`},U={key:0,class:`virtual-keyboard__functions`},W={class:`virtual-keyboard__function-grid`},G=[`disabled`,`title`,`aria-label`,`onClick`],K={class:`virtual-keyboard__body`},q={class:`virtual-keyboard__operators`},J={class:`virtual-keyboard__label`},Y=[`disabled`,`aria-label`,`onClick`],te={class:`virtual-keyboard__numbers`},X={class:`virtual-keyboard__keys virtual-keyboard__keys--numbers`},Z=[`disabled`,`aria-label`,`onClick`],Q={class:`virtual-keyboard__footer`},ne={class:`virtual-keyboard__actions`},re=[`disabled`,`aria-label`,`onClick`],ie=(0,n.defineComponent)({name:`VirtualKeyboard`,__name:`VirtualKeyboard`,props:{disabled:{type:Boolean,default:!1},functions:{default:()=>[]}},emits:[`key-press`,`insert-function`,`action`],setup(t){let r=a.filter(e=>e.type===`number`),s=o.map(e=>({...e,label:e.value===`BACKSPACE`?`退格`:e.label,icon:e.value===`BACKSPACE`?`M9 4h12v16H9L2 12zM9.9 6 4.6 12l5.3 6H19V6zM11 8l6 6-1.4 1.4-6-6zM15.6 8 17 9.4l-6 6-1.4-1.4z`:`M5 5h14v2H5zM9 2h6v2H9zM7 8h2v11h6V8h2v13H7zM10 8h1v9h-1zM13 8h1v9h-1z`})),c=[{name:`arithmetic`,label:`四则与取余`,keys:[...a,...i].filter(e=>e.type===`operator`)},{name:`compare`,label:`比较判断`,keys:i.filter(e=>e.type===`compare`)},{name:`logic`,label:`括号与条件`,keys:i.filter(e=>e.type===`paren`||e.type===`logic`)}];return(i,a)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,H,[t.functions.length?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,U,[a[1]||=(0,n.createElementVNode)(`span`,{class:`virtual-keyboard__label`},`函数快捷输入`,-1),(0,n.createElementVNode)(`div`,W,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(t.functions,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e.name,type:`button`,class:`virtual-keyboard__function`,disabled:t.disabled,title:`${e.signature} · ${e.description}`,"aria-label":`插入函数 ${e.name}`,onClick:t=>i.$emit(`insert-function`,e)},[(0,n.createTextVNode)((0,n.toDisplayString)(e.name),1),a[0]||=(0,n.createElementVNode)(`span`,null,`( )`,-1)],8,G))),128))])])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createElementVNode)(`div`,K,[(0,n.createElementVNode)(`div`,q,[((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(c,e=>(0,n.createElementVNode)(`section`,{key:e.label,class:`virtual-keyboard__group`},[(0,n.createElementVNode)(`h3`,J,(0,n.toDisplayString)(e.label),1),(0,n.createElementVNode)(`div`,{class:(0,n.normalizeClass)([`virtual-keyboard__keys`,`virtual-keyboard__keys--${e.name}`])},[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(e.keys,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e.value,type:`button`,class:(0,n.normalizeClass)([`virtual-keyboard__key`,e.color&&`virtual-keyboard__key--${e.color}`]),disabled:t.disabled,"aria-label":`插入 ${e.label}`,onClick:t=>i.$emit(`key-press`,e)},(0,n.toDisplayString)(e.label),11,Y))),128))],2)])),64))]),(0,n.createElementVNode)(`section`,te,[a[2]||=(0,n.createElementVNode)(`h3`,{class:`virtual-keyboard__label`},`数字输入`,-1),(0,n.createElementVNode)(`div`,X,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)((0,n.unref)(r),e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e.value,type:`button`,class:(0,n.normalizeClass)([`virtual-keyboard__key`,{"virtual-keyboard__key--zero":e.value===`0`}]),disabled:t.disabled,"aria-label":`输入 ${e.label}`,onClick:t=>i.$emit(`key-press`,e)},(0,n.toDisplayString)(e.label),11,Z))),128))])])]),(0,n.createElementVNode)(`footer`,Q,[a[3]||=(0,n.createElementVNode)(`span`,null,`按键会插入到光标处,选中文字可直接替换。`,-1),(0,n.createElementVNode)(`div`,ne,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)((0,n.unref)(s),r=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:r.value,type:`button`,class:(0,n.normalizeClass)([`virtual-keyboard__action`,{"virtual-keyboard__action--clear":r.value===`CLEAR`}]),disabled:t.disabled,"aria-label":r.label,onClick:e=>i.$emit(`action`,r.value)},[(0,n.createVNode)(e.t,{type:`svg`,"svg-path":r.icon,size:16},null,8,[`svg-path`]),(0,n.createTextVNode)((0,n.toDisplayString)(r.label),1)],10,re))),128))])])]))}});var ae=t.t(ie,[[`__scopeId`,`data-v-05f0982d`]]);const oe={class:`formula-preview`,"aria-label":`公式试算`},se={class:`formula-preview__result-label`},ce={key:0,class:`formula-preview__result-value`},le={key:1,class:`formula-preview__result-empty`},ue={class:`formula-preview__vars`},de={class:`formula-preview__vars-title`},fe={class:`formula-preview__var-heading`},pe=[`for`],me={key:3,class:`formula-preview__var-value`},he={key:4},ge={key:0,class:`formula-preview__empty`},_e=(0,n.defineComponent)({name:`FormulaPreview`,__name:`FormulaPreview`,props:{formula:{},evalResult:{},usedVariables:{},editable:{type:Boolean}},emits:[`update-value`],setup(e,{emit:t}){let i=t,a=`formula-sample-${(0,n.useId)()}`;function o(e){return typeof e==`number`?new Intl.NumberFormat(void 0,{maximumFractionDigits:6}).format(e):typeof e==`boolean`?e?`真 · true`:`假 · false`:String(e)}return(t,s)=>((0,n.openBlock)(),(0,n.createElementBlock)(`aside`,oe,[s[1]||=(0,n.createElementVNode)(`header`,null,[(0,n.createElementVNode)(`span`,{class:`formula-preview__step`},`02`),(0,n.createElementVNode)(`div`,null,[(0,n.createElementVNode)(`h3`,null,`验证计算结果`),(0,n.createElementVNode)(`p`,null,`调整试算值,观察规则是否符合预期。`)])],-1),(0,n.createElementVNode)(`div`,{class:(0,n.normalizeClass)([`formula-preview__result`,{"formula-preview__result--error":!!e.evalResult.error}]),role:`status`,"aria-live":`polite`},[(0,n.createElementVNode)(`span`,se,(0,n.toDisplayString)(e.evalResult.error?`暂时无法计算`:`试算结果`),1),e.evalResult.success&&e.evalResult.result!==void 0?((0,n.openBlock)(),(0,n.createElementBlock)(`output`,ce,(0,n.toDisplayString)(o(e.evalResult.result)),1)):((0,n.openBlock)(),(0,n.createElementBlock)(`span`,le,(0,n.toDisplayString)(e.formula.trim()?e.evalResult.error||`等待数据`:`输入公式后展示结果`),1))],2),(0,n.createElementVNode)(`div`,ue,[(0,n.createElementVNode)(`div`,de,[s[0]||=(0,n.createTextVNode)(`本次使用的试算值 `,-1),(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(e.usedVariables.length)+` 项`,1)]),((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(e.usedVariables,t=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:t.field,class:`formula-preview__var-row`},[(0,n.createElementVNode)(`div`,fe,[(0,n.createElementVNode)(`label`,{for:`${a}-${t.field}`},(0,n.toDisplayString)(t.name),9,pe),(0,n.createElementVNode)(`code`,null,(0,n.toDisplayString)(t.field),1)]),e.editable&&t.type===`number`?((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.NInputNumber),{key:0,value:typeof t.value==`number`?t.value:null,"input-props":{id:`${a}-${t.field}`,"aria-label":`试算值:${t.name}`},placeholder:`请输入数值`,"onUpdate:value":e=>i(`update-value`,t.field,e)},null,8,[`value`,`input-props`,`onUpdate:value`])):e.editable&&t.type===`boolean`?((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.NSwitch),{key:1,value:t.value===!0,"aria-label":`试算值:${t.name}`,"onUpdate:value":e=>i(`update-value`,t.field,e)},null,8,[`value`,`aria-label`,`onUpdate:value`])):e.editable&&t.type===`text`?((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.NInput),{key:2,value:typeof t.value==`string`?t.value:``,"input-props":{id:`${a}-${t.field}`,"aria-label":`试算值:${t.name}`},"onUpdate:value":e=>i(`update-value`,t.field,e)},null,8,[`value`,`input-props`,`onUpdate:value`])):((0,n.openBlock)(),(0,n.createElementBlock)(`span`,me,(0,n.toDisplayString)(t.value??`未提供`),1)),t.description?((0,n.openBlock)(),(0,n.createElementBlock)(`p`,he,(0,n.toDisplayString)(t.description),1)):(0,n.createCommentVNode)(`v-if`,!0)]))),128)),e.usedVariables.length?(0,n.createCommentVNode)(`v-if`,!0):((0,n.openBlock)(),(0,n.createElementBlock)(`p`,ge,(0,n.toDisplayString)(e.formula.trim()?`当前公式没有引用变量。`:`引用变量后,对应数据会出现在这里。`),1))]),s[2]||=(0,n.createElementVNode)(`p`,{class:`formula-preview__note`},`试算值仅用于本次验证,修改不会写入业务数据。`,-1)]))}});var ve=t.t(_e,[[`__scopeId`,`data-v-b2656900`]]);const ye={class:`c-formula__title-row`},be={class:`c-formula__actions`},$={key:0,class:`c-formula__templates`,"aria-label":`公式模板`},xe=[`disabled`,`aria-pressed`,`onClick`],Se={key:0,class:`c-formula__sidebar`},Ce={class:`c-formula__main`},we={key:0,class:`c-formula__keyboard`,open:``},Te={class:`c-formula__guide`},Ee=(0,n.defineComponent)({name:`C_FormulaEditor`,__name:`index`,props:{modelValue:{},config:{},variables:{},functions:{},sampleData:{},disabled:{type:Boolean,default:!1},placeholder:{},height:{},showPreview:{type:Boolean,default:!0},showKeyboard:{type:Boolean,default:!0},showVariablePanel:{type:Boolean,default:!0},editableSampleData:{type:Boolean,default:!0},templates:{}},emits:[`update:modelValue`,`change`,`validation-change`],setup(t,{expose:i,emit:a}){let o=t,s=a,{options:c,formula:l,analysis:u,evalResult:d,usedVariables:f,updateSample:p,reset:m}=ee(o),h=(0,n.ref)();(0,n.watch)(l,e=>{s(`update:modelValue`,e),s(`change`,e)}),(0,n.watch)(()=>u.value.validation,e=>s(`validation-change`,e),{immediate:!0});function g(e){c.value.disabled||(l.value=e)}function _(e){c.value.disabled||h.value?.insertAtCursor(e)}function v(e){c.value.disabled||(e===`BACKSPACE`&&h.value?.backspace(),e===`CLEAR`&&h.value?.clear())}return i({getValue:()=>l.value,setValue:e=>{l.value=e},reset:m,validate:()=>u.value.validation,insertAtCursor:_,focus:()=>h.value?.focus()}),(t,i)=>((0,n.openBlock)(),(0,n.createElementBlock)(`section`,{class:`c-formula`,style:(0,n.normalizeStyle)({height:typeof(0,n.unref)(c).height==`number`?`${(0,n.unref)(c).height}px`:(0,n.unref)(c).height}),"aria-label":`公式编辑器`},[(0,n.createElementVNode)(`header`,ye,[i[5]||=(0,n.createElementVNode)(`div`,null,[(0,n.createElementVNode)(`span`,{class:`c-formula__eyebrow`},`FORMULA WORKBENCH`),(0,n.createElementVNode)(`h2`,null,`规则与试算`),(0,n.createElementVNode)(`p`,null,`插入变量、编辑公式,再用试算值验证结果。`)],-1),(0,n.createElementVNode)(`div`,be,[(0,n.createVNode)((0,n.unref)(r.NTag),{type:(0,n.unref)(l).trim()?(0,n.unref)(u).validation.valid?`success`:`error`:`default`,size:`small`},{default:(0,n.withCtx)(()=>[(0,n.createTextVNode)((0,n.toDisplayString)((0,n.unref)(l).trim()?(0,n.unref)(u).validation.valid?`语法有效`:`需要修正`:`等待输入`),1)]),_:1},8,[`type`]),(0,n.createVNode)((0,n.unref)(r.NButton),{size:`small`,disabled:(0,n.unref)(c).disabled,onClick:(0,n.unref)(m)},{default:(0,n.withCtx)(()=>[...i[4]||=[(0,n.createTextVNode)(`重置`,-1)]]),_:1},8,[`disabled`,`onClick`])])]),(0,n.unref)(c).templates.length?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,$,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)((0,n.unref)(c).templates,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e.value,type:`button`,disabled:(0,n.unref)(c).disabled,"aria-pressed":(0,n.unref)(l)===e.value,onClick:t=>l.value=e.value},[(0,n.createElementVNode)(`strong`,null,(0,n.toDisplayString)(e.label),1),(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(e.description),1)],8,xe))),128))])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createElementVNode)(`div`,{class:(0,n.normalizeClass)([`c-formula__body`,{"c-formula__body--no-sidebar":!(0,n.unref)(c).showVariablePanel,"c-formula__body--no-preview":!(0,n.unref)(c).showPreview}])},[(0,n.unref)(c).showVariablePanel?((0,n.openBlock)(),(0,n.createElementBlock)(`aside`,Se,[(0,n.createVNode)(V,{variables:(0,n.unref)(c).variables,functions:(0,n.unref)(c).functions,disabled:(0,n.unref)(c).disabled,onSelectVariable:i[0]||=e=>_(`[${e.name}]`),onSelectFunction:i[1]||=e=>_(`${e.name}(`)},null,8,[`variables`,`functions`,`disabled`])])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createElementVNode)(`div`,Ce,[(0,n.createVNode)(E,{ref_key:`formulaInputRef`,ref:h,formula:(0,n.unref)(l),tokens:(0,n.unref)(u).tokens,validation:(0,n.unref)(u).validation,disabled:(0,n.unref)(c).disabled,placeholder:(0,n.unref)(c).placeholder,"onUpdate:formula":g},null,8,[`formula`,`tokens`,`validation`,`disabled`,`placeholder`]),(0,n.unref)(c).showKeyboard?((0,n.openBlock)(),(0,n.createElementBlock)(`details`,we,[(0,n.createElementVNode)(`summary`,null,[(0,n.createVNode)(e.t,{type:`svg`,"svg-path":`M4 5h16v14H4zM6 7v10h12V7zM7 8h2v2H7zM10 8h2v2h-2zM13 8h2v2h-2zM16 8h1v2h-1zM7 11h2v2H7zM10 11h2v2h-2zM13 11h2v2h-2zM16 11h1v2h-1zM8 14h8v2H8z`,size:18}),i[6]||=(0,n.createElementVNode)(`span`,{class:`c-formula__keyboard-title`},[(0,n.createTextVNode)(`公式键盘`),(0,n.createElementVNode)(`small`,null,`数字、运算与函数 · 点击插入`)],-1),(0,n.createVNode)(e.t,{class:`c-formula__keyboard-chevron`,type:`svg`,"svg-path":`M6 8l6 6 6-6 1.4 1.4L12 16.8 4.6 9.4z`,size:18})]),(0,n.createVNode)(ae,{disabled:(0,n.unref)(c).disabled,functions:(0,n.unref)(c).functions,onKeyPress:i[2]||=e=>_(e.value),onInsertFunction:i[3]||=e=>_(`${e.name}(`),onAction:v},null,8,[`disabled`,`functions`])])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createElementVNode)(`div`,Te,[(0,n.createVNode)(e.t,{name:`mdi:information-outline`,size:16}),i[7]||=(0,n.createElementVNode)(`p`,null,[(0,n.createTextVNode)(`变量使用 `),(0,n.createElementVNode)(`code`,null,`[变量名]`),(0,n.createTextVNode)(`,支持括号、比较和条件函数。右侧结果是当前数据的本地试算。`)],-1)])]),(0,n.unref)(c).showPreview?((0,n.openBlock)(),(0,n.createBlock)(ve,{key:1,formula:(0,n.unref)(l),"eval-result":(0,n.unref)(d),"used-variables":(0,n.unref)(f),editable:(0,n.unref)(c).editableSampleData&&!(0,n.unref)(c).disabled,onUpdateValue:(0,n.unref)(p)},null,8,[`formula`,`eval-result`,`used-variables`,`editable`,`onUpdateValue`])):(0,n.createCommentVNode)(`v-if`,!0)],2)],4))}});var De=t.t(Ee,[[`__scopeId`,`data-v-b006a294`]]);function Oe(e){let t=(0,n.computed)(()=>{let t=new Map;for(let n of e.value)t.set(n.name,n.field);return t}),r,i;function a(e,n){if(!e.trim())return{success:!0,result:void 0};try{return(!i||r!==e)&&(i=y(e),r=e),{success:!0,result:i.evaluate(t.value,n)}}catch(e){return{success:!1,result:void 0,error:e instanceof Error?e.message:String(e)}}}function o(e){try{return[...new Set(b(e).filter(e=>e.type===`variable`).map(e=>e.value))]}catch{return[]}}return{evaluate:a,extractVariableNames:o,variableMap:t}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Oe}});
@@ -1,2 +1,2 @@
1
1
  import{t as e}from"./C_Icon2.js";import{t}from"./export-helper.js";import{Fragment as n,computed as r,createBlock as i,createCommentVNode as a,createElementBlock as o,createElementVNode as s,createTextVNode as c,createVNode as l,defineComponent as u,nextTick as d,normalizeClass as f,normalizeStyle as p,openBlock as m,ref as h,renderList as g,toDisplayString as _,unref as v,useId as y,vModelText as b,vShow as x,watch as S,withCtx as C,withDirectives as w}from"vue";import{NButton as T,NEmpty as E,NInput as D,NInputNumber as O,NScrollbar as k,NSwitch as A,NTag as j}from"naive-ui";const M=[{label:`?`,value:` ? `,type:`logic`,color:`warning`},{label:`:`,value:` : `,type:`logic`,color:`warning`},{label:`and`,value:` AND `,type:`logic`,color:`warning`},{label:`or`,value:` OR `,type:`logic`,color:`warning`},{label:`(`,value:`(`,type:`paren`},{label:`)`,value:`)`,type:`paren`},{label:`,`,value:`, `,type:`paren`},{label:`==`,value:` == `,type:`compare`},{label:`>`,value:` > `,type:`compare`},{label:`<`,value:` < `,type:`compare`},{label:`≥`,value:` >= `,type:`compare`},{label:`≤`,value:` <= `,type:`compare`},{label:`≠`,value:` != `,type:`compare`},{label:`%`,value:` % `,type:`operator`}],N=[{label:`1`,value:`1`,type:`number`},{label:`2`,value:`2`,type:`number`},{label:`3`,value:`3`,type:`number`},{label:`+`,value:` + `,type:`operator`,color:`primary`},{label:`−`,value:` - `,type:`operator`,color:`primary`},{label:`4`,value:`4`,type:`number`},{label:`5`,value:`5`,type:`number`},{label:`6`,value:`6`,type:`number`},{label:`×`,value:` * `,type:`operator`,color:`primary`},{label:`÷`,value:` / `,type:`operator`,color:`primary`},{label:`7`,value:`7`,type:`number`},{label:`8`,value:`8`,type:`number`},{label:`9`,value:`9`,type:`number`},{label:`0`,value:`0`,type:`number`},{label:`.`,value:`.`,type:`number`}],P=[{label:`⌫`,value:`BACKSPACE`,type:`action`,isAction:!0},{label:`清空`,value:`CLEAR`,type:`action`,isAction:!0}],F=[{name:`IF`,signature:`IF(条件, 真值, 假值)`,description:`根据条件返回不同的值`,category:`逻辑`},{name:`AND`,signature:`AND(条件1, 条件2)`,description:`全部条件为真时返回真`,category:`逻辑`},{name:`OR`,signature:`OR(条件1, 条件2)`,description:`任一条件为真时返回真`,category:`逻辑`},{name:`NOT`,signature:`NOT(条件)`,description:`对条件取反`,category:`逻辑`},{name:`SUM`,signature:`SUM(值1, 值2, ...)`,description:`计算所有值的总和`,category:`数学`},{name:`AVG`,signature:`AVG(值1, 值2, ...)`,description:`计算所有值的平均值`,category:`数学`},{name:`MAX`,signature:`MAX(值1, 值2, ...)`,description:`返回最大值`,category:`数学`},{name:`MIN`,signature:`MIN(值1, 值2, ...)`,description:`返回最小值`,category:`数学`},{name:`ABS`,signature:`ABS(数值)`,description:`返回绝对值`,category:`数学`},{name:`ROUND`,signature:`ROUND(数值, 小数位)`,description:`四舍五入到指定小数位`,category:`数学`},{name:`CEIL`,signature:`CEIL(数值)`,description:`向上取整`,category:`数学`},{name:`FLOOR`,signature:`FLOOR(数值)`,description:`向下取整`,category:`数学`}],ee=new Set([`+`,`-`,`*`,`/`,`%`,`>`,`<`,`>=`,`<=`,`==`,`!=`,`?`,`:`,`AND`,`OR`,`NOT`]),I=new Set([`+`,`-`,`*`,`/`,`%`,`>`,`<`,`>=`,`<=`,`==`,`!=`,`?`,`:`,`AND`,`OR`]),L=1e4,R=5e3,z=Object.freeze({IF:(e,t,n)=>e?t:n,AND:(...e)=>e.every(Boolean),OR:(...e)=>e.some(Boolean),NOT:e=>!e,SUM:(...e)=>e.reduce((e,t)=>e+B(t),0),AVG:(...e)=>e.length?e.reduce((e,t)=>e+B(t),0)/e.length:0,MAX:(...e)=>Math.max(...e.map(B)),MIN:(...e)=>Math.min(...e.map(B)),ABS:e=>Math.abs(B(e)),ROUND:(e,t=0)=>{let n=10**Math.min(100,Math.max(0,Math.trunc(B(t))));return Math.round(B(e)*n)/n},CEIL:e=>Math.ceil(B(e)),FLOOR:e=>Math.floor(B(e))});function B(e){let t=Number(e);if(!Number.isFinite(t))throw Error(`无法将“${String(e)}”转换为有限数值`);return t}function V(e){if(e.length>L)throw Error(`公式长度不能超过 ${L} 个字符`);let t=[],n=0,r=e=>{if(t.push(e),t.length>R)throw Error(`公式不能超过 ${R} 个词元`)};for(;n<e.length;){let t=e[n];if(/\s/.test(t)){n+=1;continue}let i=e.slice(n),a=/^(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?/i.exec(i);if(a){r({type:`number`,value:a[0],position:n}),n+=a[0].length;continue}if(t===`[`){let t=e.indexOf(`]`,n+1);if(t===-1)throw Error(`第 ${n+1} 个字符处缺少 ]`);let i=e.slice(n+1,t).trim();if(!i)throw Error(`第 ${n+1} 个字符处的变量名不能为空`);r({type:`variable`,value:i,position:n}),n=t+1;continue}if(t===`"`||t===`'`){let i=t,a=n,o=``,s=!1;for(n+=1;n<e.length;){let t=e[n];if(t===i){s=!0,n+=1;break}if(t===`\\`){if(n+=1,n>=e.length)break;let t=e[n];o+={n:`
2
- `,r:`\r`,t:` `}[t]??t}else o+=t;n+=1}if(!s)throw Error(`第 ${a+1} 个字符处的字符串未闭合`);r({type:`string`,value:o,position:a});continue}let o=e.slice(n,n+2);if([`>=`,`<=`,`==`,`!=`].includes(o)){r({type:`operator`,value:o,position:n}),n+=2;continue}if(`+-*/%><?:`.includes(t)){r({type:`operator`,value:t,position:n}),n+=1;continue}if(`(),`.includes(t)){r({type:`punctuation`,value:t,position:n}),n+=1;continue}let s=/^[A-Za-z_][A-Za-z0-9_]*/.exec(i);if(s){let e=s[0],t=e.toUpperCase();r({type:[`AND`,`OR`,`NOT`].includes(t)?`operator`:`identifier`,value:[`AND`,`OR`,`NOT`].includes(t)?t:e,position:n}),n+=e.length;continue}throw Error(`第 ${n+1} 个字符“${t}”不受支持`)}return t.push({type:`eof`,value:``,position:n}),t}var te=class{cursor=0;nestingDepth=0;constructor(e){this.tokens=e}parse(){let e=this.parseConditional();return this.expect(`eof`),e}current(){return this.tokens[this.cursor]}advance(){return this.tokens[this.cursor++]}consume(e){return this.current().value===e?(this.advance(),!0):!1}expect(e,t){let n=this.current();if(n.type!==e||t!==void 0&&n.value!==t)throw Error(`第 ${n.position+1} 个字符处应为 ${t??e}`);return this.advance()}parseConditional(){if(++this.nestingDepth>100)throw Error(`公式嵌套不能超过 100 层`);try{let e=this.parseOr();if(!this.consume(`?`))return e;let t=this.parseConditional();return this.expect(`operator`,`:`),{kind:`conditional`,condition:e,truthy:t,falsy:this.parseConditional()}}finally{this.nestingDepth--}}parseBinary(e,t){let n=e();for(;t.includes(this.current().value);)n={kind:`binary`,operator:this.advance().value,left:n,right:e()};return n}parseOr(){return this.parseBinary(()=>this.parseAnd(),[`OR`])}parseAnd(){return this.parseBinary(()=>this.parseEquality(),[`AND`])}parseEquality(){return this.parseBinary(()=>this.parseComparison(),[`==`,`!=`])}parseComparison(){return this.parseBinary(()=>this.parseAdditive(),[`>`,`>=`,`<`,`<=`])}parseAdditive(){return this.parseBinary(()=>this.parseMultiplicative(),[`+`,`-`])}parseMultiplicative(){return this.parseBinary(()=>this.parseUnary(),[`*`,`/`,`%`])}parseUnary(){let e=[];for(;[`-`,`+`,`NOT`].includes(this.current().value)&&!(this.current().value===`NOT`&&this.tokens[this.cursor+1]?.value===`(`);)if(e.push(this.advance().value),e.length>100)throw Error(`一元运算不能超过 100 层`);let t=this.parsePrimary();for(let n of e.reverse())t={kind:`unary`,operator:n,value:t};return t}parsePrimary(){let e=this.current();if(e.type===`number`||e.type===`string`)return this.advance(),{kind:`literal`,value:e.type===`number`?Number(e.value):e.value};if(e.type===`variable`)return this.advance(),{kind:`variable`,name:e.value};if(e.type===`identifier`||e.type===`operator`&&[`AND`,`OR`,`NOT`].includes(e.value)){this.advance();let t=e.value.toUpperCase();if(t===`TRUE`||t===`FALSE`)return{kind:`literal`,value:t===`TRUE`};if(this.consume(`(`))return this.parseFunction(t,e);if(t===`NOT`)return{kind:`unary`,operator:`NOT`,value:this.parseUnary()};if(e.type===`identifier`)return{kind:`identifier`,name:e.value}}if(this.consume(`(`)){let e=this.parseConditional();return this.expect(`punctuation`,`)`),e}throw Error(`第 ${e.position+1} 个字符处缺少有效值`)}parseFunction(e,t){if(!Object.prototype.hasOwnProperty.call(z,e))throw Error(`第 ${t.position+1} 个字符处:未知函数“${t.value}”`);let n=[];if(!this.consume(`)`)){do n.push(this.parseConditional());while(this.consume(`,`));this.expect(`punctuation`,`)`)}let[r,i]=e===`IF`?[3,3]:e===`ROUND`?[1,2]:[`AND`,`OR`,`SUM`,`AVG`,`MAX`,`MIN`].includes(e)?[1,1/0]:[1,1];if(n.length<r||n.length>i)throw Error(`第 ${t.position+1} 个字符处:${e} 需要 ${r===i?r:`${r}–${i===1/0?`多个`:i}`} 个参数`);return{kind:`call`,name:e,args:n}}};function H(e,t){if(!Object.prototype.hasOwnProperty.call(t,e)||t[e]==null)throw Error(`变量“${e}”缺少样例数据`);let n=t[e];if(![`number`,`string`,`boolean`].includes(typeof n)||typeof n==`number`&&!Number.isFinite(n))throw Error(`变量“${e}”的数据类型不受支持`);return n}function U(e,t,n){switch(e){case`==`:return t===n;case`!=`:return t!==n;case`+`:return B(t)+B(n);case`-`:return B(t)-B(n);case`*`:return B(t)*B(n);case`/`:return B(t)/B(n);case`%`:return B(t)%B(n);default:if(typeof t==`boolean`||typeof n==`boolean`)throw Error(`运算符 ${e} 不支持布尔值`);return e===`>`?t>n:e===`>=`?t>=n:e===`<`?t<n:t<=n}}function W(e,t,n,r=0){if(r>200)throw Error(`公式计算层数超过安全限制`);let i=e=>W(e,t,n,r+1);switch(e.kind){case`literal`:return e.value;case`variable`:{let r=t.get(e.name);if(!r)throw Error(`未知变量“${e.name}”`);return H(r,n)}case`identifier`:return H(e.name,n);case`conditional`:return i(e.condition)?i(e.truthy):i(e.falsy);case`unary`:{let t=i(e.value);return e.operator===`NOT`?!t:e.operator===`-`?-B(t):B(t)}case`binary`:{let t=i(e.left);return e.operator===`AND`?!!t&&!!i(e.right):e.operator===`OR`?!!t||!!i(e.right):U(e.operator,t,i(e.right))}case`call`:return e.name===`IF`?i(e.args[0])?i(e.args[1]):i(e.args[2]):e.name===`AND`?e.args.every(e=>!!i(e)):e.name===`OR`?e.args.some(e=>!!i(e)):z[e.name](...e.args.map(i))}}function G(e){let t=V(e),n=new te(t).parse();return{tokens:t,evaluate(e,t){let r=W(n,e,t);if(typeof r==`number`&&!Number.isFinite(r))throw Error(`公式计算结果必须是有限数值`);return r}}}function K(e){return V(e)}function q(e,t){let n=r(()=>new Set(e.value.map(e=>e.name))),i=r(()=>new Set(e.value.map(e=>e.field))),a=r(()=>new Set(t.value.map(e=>e.name.toUpperCase()))),o=null;function s(e){try{let t=K(e),n=[],r=0;return t.forEach((i,a)=>{if(i.type===`eof`)return;i.position>r&&n.push({type:`space`,value:e.slice(r,i.position),start:r,end:i.position});let o=e.slice(i.position,t[a+1]?.position??e.length).trimEnd();r=i.position+o.length;let s=t[a+1],c=i.type===`variable`?`variable`:i.type===`number`?`number`:s?.value===`(`&&(i.type===`identifier`||[`AND`,`OR`,`NOT`].includes(i.value))?`function`:i.type===`operator`?`operator`:i.type===`punctuation`?i.value===`,`?`comma`:`paren`:`text`;n.push({type:c,value:c===`variable`?i.value:o,start:i.position,end:r})}),r<e.length&&n.push({type:`space`,value:e.slice(r),start:r,end:e.length}),n}catch{return e?[{type:`text`,value:e,start:0,end:e.length}]:[]}}function c(e){let t=n.value,r=i.value,c=a.value;if(o?.formula===e&&o.names===t&&o.fields===r&&o.functions===c)return o.analysis;let l={tokens:s(e),validation:{valid:!0,message:e.trim()?`语法校验通过`:`尚未输入公式`},compiled:null};if(e.trim())try{l.compiled=G(e);for(let e of l.tokens){if(e.type===`variable`&&!t.has(e.value))throw Error(`第 ${e.start+1} 个字符处:未知变量「${e.value}」`);if(e.type===`function`&&!c.has(e.value.toUpperCase()))throw Error(`第 ${e.start+1} 个字符处:未知函数「${e.value}」`);if(e.type===`text`&&/^[A-Za-z_]\w*$/.test(e.value)&&![`TRUE`,`FALSE`].includes(e.value.toUpperCase())&&!r.has(e.value))throw Error(`第 ${e.start+1} 个字符处:未知字段「${e.value}」`)}}catch(e){let t=e instanceof Error?e.message:String(e),n=/第 (\d+) 个字符/.exec(t);l.validation={valid:!1,message:t,...n?{position:Number(n[1])-1}:{}},l.compiled=null}return o={formula:e,names:t,fields:r,functions:c,analysis:l},l}function l(e){return c(e).validation}function u(e,t){let n=0,r=``;for(let i of s(e).filter(e=>e.type===`variable`))r+=e.slice(n,i.start)+(t.get(i.value)??`__unknown_${i.value}__`),n=i.end;return r+e.slice(n)}return{tokenize:s,analyze:c,validate:l,toEvalExpression:u,variableNames:n,functionNames:a}}function J(e){let t=r(()=>({variables:e.config?.variables??e.variables??[],functions:e.config?.functions??e.functions??F,sampleData:e.config?.sampleData??e.sampleData??{},disabled:e.config?.disabled??e.disabled??!1,placeholder:e.config?.placeholder??e.placeholder??`例如:[完成值] / [目标值] * 100`,height:e.config?.height??e.height??`auto`,showPreview:e.config?.showPreview??e.showPreview??!0,showKeyboard:e.config?.showKeyboard??e.showKeyboard??!0,showVariablePanel:e.config?.showVariablePanel??e.showVariablePanel??!0,editableSampleData:e.config?.editableSampleData??e.editableSampleData??!0,templates:e.config?.templates??e.templates??[]})),n=e.modelValue??``,i=h(n),a=h({}),o=q(r(()=>t.value.variables),r(()=>t.value.functions)),s=r(()=>o.analyze(i.value)),c=r(()=>{let e=new Map(Object.entries(t.value.sampleData));for(let[t,n]of Object.entries(a.value))n===null?e.delete(t):e.set(t,n);return Object.fromEntries(e)}),l=r(()=>new Map(t.value.variables.map(e=>[e.name,e.field]))),u=r(()=>{let e=s.value.tokens.filter(e=>e.type===`variable`).map(e=>e.value),n=s.value.tokens.filter(e=>e.type===`text`).map(e=>e.value);return t.value.variables.filter(t=>e.includes(t.name)||n.includes(t.field)).map(e=>({...e,value:c.value[e.field]}))}),d=r(()=>{if(!s.value.validation.valid)return{success:!1,result:void 0,error:s.value.validation.message};if(!s.value.compiled)return{success:!0,result:void 0};try{return{success:!0,result:s.value.compiled.evaluate(l.value,c.value)}}catch(e){return{success:!1,result:void 0,error:e instanceof Error?e.message:String(e)}}});function f(e,n){!t.value.disabled&&t.value.editableSampleData&&(a.value={...a.value,[e]:n})}function p(){i.value=n,a.value={}}return S(()=>e.modelValue,e=>{e!==void 0&&e!==i.value&&(i.value=e)}),S(()=>t.value.sampleData,()=>{a.value={}}),{options:t,formula:i,analysis:s,evalResult:d,usedVariables:u,updateSample:f,reset:p}}const Y={class:`formula-input__header`},X=[`readonly`,`aria-invalid`,`placeholder`],Z={key:0,class:`formula-input__tokens`,"aria-label":`公式结构预览`};var Q=t(u({name:`FormulaInput`,__name:`FormulaInput`,props:{formula:{},tokens:{},validation:{},variableNames:{},disabled:{type:Boolean,default:!1},placeholder:{default:`例如:[完成值] / [目标值] * 100`}},emits:[`update:formula`],setup(e,{expose:t,emit:r}){let i=e,c=r,l=h(),u=h(i.formula),p=`formula-feedback-${y()}`,v=u.value.length,x=v;S(u,e=>c(`update:formula`,e),{flush:`sync`}),S(()=>i.formula,e=>{e!==u.value&&(u.value=e,v=x=e.length)});function C(){l.value&&(v=l.value.selectionStart,x=l.value.selectionEnd)}function T(e,t=v,n=x){if(i.disabled)return;let r=Math.max(0,Math.min(t,u.value.length));u.value=u.value.slice(0,r)+e+u.value.slice(Math.max(r,n)),v=x=r+e.length,d(()=>{l.value?.focus({preventScroll:!0}),l.value?.setSelectionRange(v,x)})}function E(e){T(e)}function D(){if(v!==x){T(``);return}if(v===0)return;let e=i.tokens.find(e=>e.type===`variable`&&e.end===v),t=Array.from(u.value.slice(0,v)).pop()?.length??1;T(``,e?.start??v-t,x)}function O(){T(``,0,u.value.length)}function k(){v=x=u.value.length,l.value?.setSelectionRange(v,x)}function A(){l.value?.focus({preventScroll:!0}),k()}function j(){let e=i.validation.position??0;l.value?.focus({preventScroll:!0}),l.value?.setSelectionRange(e,Math.min(e+1,u.value.length)),C()}return t({insertAtCursor:E,backspace:D,focus:A,moveCursorToEnd:k}),(t,r)=>(m(),o(`div`,{class:f([`formula-input`,{"formula-input--disabled":e.disabled,"formula-input--error":!e.validation.valid&&e.formula.trim()}])},[s(`div`,Y,[r[1]||=s(`span`,{class:`formula-input__label`},`01 / 编辑公式`,-1),e.formula.trim()&&!e.disabled?(m(),o(`button`,{key:0,type:`button`,class:`formula-input__clear`,onClick:O},`清空公式`)):a(`v-if`,!0)]),w(s(`textarea`,{ref_key:`editorRef`,ref:l,"onUpdate:modelValue":r[0]||=e=>u.value=e,class:`formula-input__editor`,readonly:e.disabled,"aria-label":`公式输入`,"aria-invalid":!e.validation.valid&&!!e.formula.trim(),"aria-describedby":p,placeholder:e.placeholder,spellcheck:`false`,onSelect:C,onClick:C,onKeyup:C,onBlur:C},null,40,X),[[b,u.value]]),e.tokens.length?(m(),o(`div`,Z,[r[2]||=s(`span`,{class:`formula-input__tokens-label`},`结构预览`,-1),(m(!0),o(n,null,g(e.tokens,(e,t)=>(m(),o(`span`,{key:t,class:f(`formula-token formula-token--${e.type}`)},_(e.type===`variable`?`[${e.value}]`:e.value),3))),128))])):a(`v-if`,!0),s(`div`,{id:p,class:`formula-input__validation`,role:`status`},[s(`span`,{class:f(e.formula.trim()?e.validation.valid?`formula-input__validation-success`:`formula-input__validation-error`:`formula-input__validation-hint`)},_(e.formula.trim()?e.validation.valid?`语法校验通过,可在右侧调整数据试算。`:e.validation.message:`点击左侧变量开始,也可以直接输入 [变量名]。`),3),e.validation.position===void 0?a(`v-if`,!0):(m(),o(`button`,{key:0,type:`button`,class:`formula-input__locate`,onClick:j},`定位错误`))])],2))}}),[[`__scopeId`,`data-v-6bf933c2`]]);const ne={class:`variable-panel`},re={class:`variable-panel__tabs`},ie=[`aria-pressed`],ae=[`aria-pressed`],oe={class:`variable-panel__search`},se=[`aria-expanded`,`onClick`],ce={class:`variable-panel__items`},le=[`disabled`,`onClick`],ue={key:0},de=[`disabled`,`onClick`],fe={class:`variable-panel__func-name`},pe={class:`variable-panel__func-desc`},me={class:`variable-panel__func-sig`};var he=t(u({__name:`VariablePanel`,props:{variables:{},functions:{},disabled:{type:Boolean}},emits:[`select-variable`,`select-function`],setup(t){let u=t,d=h(`variable`),p=h(``),y=h(new Set),b=r(()=>{let e=p.value.toLowerCase(),t=e?u.variables.filter(t=>t.name.toLowerCase().includes(e)||t.field.toLowerCase().includes(e)||(t.description??``).toLowerCase().includes(e)):u.variables,n=new Map;for(let e of t){let t=e.group??`其他`,r=n.get(t);r?r.push(e):n.set(t,[e])}return Array.from(n,([e,t])=>({name:e,items:t}))});S(b,e=>{for(let t of e)y.value.add(t.name)},{immediate:!0});function T(e){y.value.has(e)?y.value.delete(e):y.value.add(e)}let O=r(()=>{let e=p.value.toLowerCase();return e?u.functions.filter(t=>t.name.toLowerCase().includes(e)||t.description.toLowerCase().includes(e)):u.functions});function A(e){switch(e){case`number`:return`mdi:numeric`;case`text`:return`mdi:format-text`;case`boolean`:return`mdi:toggle-switch-outline`;default:return`mdi:variable`}}return(r,u)=>(m(),o(`div`,ne,[a(` 切换 Tab:变量 / 函数 `),s(`div`,re,[s(`button`,{type:`button`,class:f([`variable-panel__tab`,{"variable-panel__tab--active":d.value===`variable`}]),"aria-pressed":d.value===`variable`,onClick:u[0]||=e=>d.value=`variable`},` 可用变量 `,10,ie),s(`button`,{type:`button`,class:f([`variable-panel__tab`,{"variable-panel__tab--active":d.value===`function`}]),"aria-pressed":d.value===`function`,onClick:u[1]||=e=>d.value=`function`},` 常用函数 `,10,ae)]),a(` 搜索框 `),s(`div`,oe,[l(v(D),{value:p.value,"onUpdate:value":u[2]||=e=>p.value=e,size:`small`,placeholder:`搜索变量或函数`,"input-props":{"aria-label":`搜索变量或函数`},clearable:``},{prefix:C(()=>[l(e,{name:`mdi:magnify`,size:16})]),_:1},8,[`value`])]),a(` 变量列表 `),d.value===`variable`?(m(),i(v(k),{key:0,class:`variable-panel__list`},{default:C(()=>[b.value.length>0?(m(!0),o(n,{key:0},g(b.value,i=>(m(),o(`div`,{key:i.name,class:`variable-panel__group`},[s(`button`,{type:`button`,class:`variable-panel__group-title`,"aria-expanded":y.value.has(i.name),onClick:e=>T(i.name)},[l(e,{name:y.value.has(i.name)?`mdi:chevron-down`:`mdi:chevron-right`,size:16},null,8,[`name`]),c(` `+_(i.name),1)],8,se),w(s(`div`,ce,[(m(!0),o(n,null,g(i.items,n=>(m(),o(`button`,{key:n.field,type:`button`,class:`variable-panel__item`,disabled:t.disabled,onClick:e=>r.$emit(`select-variable`,n)},[l(e,{name:A(n.type),size:15,class:`variable-panel__item-icon`},null,8,[`name`]),s(`span`,null,[c(_(n.name),1),n.description?(m(),o(`small`,ue,_(n.description),1)):a(`v-if`,!0)])],8,le))),128))],512),[[x,y.value.has(i.name)]])]))),128)):(m(),i(v(E),{key:1,size:`small`,description:`无匹配变量`}))]),_:1})):(m(),o(n,{key:1},[a(` 函数列表 `),l(v(k),{class:`variable-panel__list`},{default:C(()=>[O.value.length>0?(m(!0),o(n,{key:0},g(O.value,e=>(m(),o(`button`,{key:e.name,type:`button`,class:`variable-panel__func`,disabled:t.disabled,onClick:t=>r.$emit(`select-function`,e)},[s(`div`,fe,[u[3]||=s(`span`,{class:`variable-panel__func-badge`},`ƒ`,-1),c(` `+_(e.name),1)]),s(`div`,pe,_(e.description),1),s(`div`,me,_(e.signature),1)],8,de))),128)):(m(),i(v(E),{key:1,size:`small`,description:`无匹配函数`}))]),_:1})],2112))]))}}),[[`__scopeId`,`data-v-2d73fec7`]]);const ge={class:`vk`},_e={class:`vk__body`},ve={class:`vk__half vk__half--ops`},ye=[`disabled`,`onClick`],be={class:`vk__half vk__half--nums`},xe=[`disabled`,`onClick`],Se={class:`vk__actions`},Ce=[`disabled`,`onClick`];var we=t(u({__name:`VirtualKeyboard`,props:{disabled:{type:Boolean,default:!1}},emits:[`key-press`,`action`],setup(e){let t=M,r=N,i=P;return(c,l)=>(m(),o(`div`,ge,[a(` ═══════ 标题行 ═══════ `),l[0]||=s(`div`,{class:`vk__title`},`计算公式`,-1),a(` ═══════ 键盘主体:运算符 | 数字 ═══════ `),s(`div`,_e,[a(` 运算符区 5 列 `),s(`div`,ve,[(m(!0),o(n,null,g(v(t),t=>(m(),o(`button`,{key:t.value,class:f([`vk__key`,[t.color?`vk__key--${t.color}`:``]]),disabled:e.disabled,onClick:e=>c.$emit(`key-press`,t)},_(t.label),11,ye))),128))]),a(` 数字区 5 列 `),s(`div`,be,[(m(!0),o(n,null,g(v(r),t=>(m(),o(`button`,{key:t.label+t.value,class:f([`vk__key`,[t.color?`vk__key--${t.color}`:``]]),disabled:e.disabled,onClick:e=>c.$emit(`key-press`,t)},_(t.label),11,xe))),128))])]),a(` ═══════ 动作行:⌫ + 清空 ═══════ `),s(`div`,Se,[(m(!0),o(n,null,g(v(i),t=>(m(),o(`button`,{key:t.value,class:`vk__key vk__key--action`,disabled:e.disabled,onClick:e=>c.$emit(`action`,t.value)},_(t.label),9,Ce))),128))])]))}}),[[`__scopeId`,`data-v-8c874c05`]]);const Te={class:`formula-preview`,"aria-label":`公式试算`},Ee={class:`formula-preview__result-label`},De={key:0,class:`formula-preview__result-value`},Oe={key:1,class:`formula-preview__result-empty`},ke={class:`formula-preview__vars`},Ae={class:`formula-preview__vars-title`},je={class:`formula-preview__var-heading`},Me=[`for`],Ne={key:3,class:`formula-preview__var-value`},Pe={key:4},$={key:0,class:`formula-preview__empty`};var Fe=t(u({name:`FormulaPreview`,__name:`FormulaPreview`,props:{formula:{},evalResult:{},usedVariables:{},editable:{type:Boolean}},emits:[`update-value`],setup(e,{emit:t}){let r=t,l=`formula-sample-${y()}`;function u(e){return typeof e==`number`?new Intl.NumberFormat(void 0,{maximumFractionDigits:6}).format(e):typeof e==`boolean`?e?`真 · true`:`假 · false`:String(e)}return(t,d)=>(m(),o(`aside`,Te,[d[1]||=s(`header`,null,[s(`span`,{class:`formula-preview__step`},`02`),s(`div`,null,[s(`h3`,null,`验证计算结果`),s(`p`,null,`调整试算值,观察规则是否符合预期。`)])],-1),s(`div`,{class:f([`formula-preview__result`,{"formula-preview__result--error":!!e.evalResult.error}]),role:`status`,"aria-live":`polite`},[s(`span`,Ee,_(e.evalResult.error?`暂时无法计算`:`试算结果`),1),e.evalResult.success&&e.evalResult.result!==void 0?(m(),o(`output`,De,_(u(e.evalResult.result)),1)):(m(),o(`span`,Oe,_(e.formula.trim()?e.evalResult.error||`等待数据`:`输入公式后展示结果`),1))],2),s(`div`,ke,[s(`div`,Ae,[d[0]||=c(`本次使用的试算值 `,-1),s(`span`,null,_(e.usedVariables.length)+` 项`,1)]),(m(!0),o(n,null,g(e.usedVariables,t=>(m(),o(`div`,{key:t.field,class:`formula-preview__var-row`},[s(`div`,je,[s(`label`,{for:`${l}-${t.field}`},_(t.name),9,Me),s(`code`,null,_(t.field),1)]),e.editable&&t.type===`number`?(m(),i(v(O),{key:0,value:typeof t.value==`number`?t.value:null,"input-props":{id:`${l}-${t.field}`,"aria-label":`试算值:${t.name}`},placeholder:`请输入数值`,"onUpdate:value":e=>r(`update-value`,t.field,e)},null,8,[`value`,`input-props`,`onUpdate:value`])):e.editable&&t.type===`boolean`?(m(),i(v(A),{key:1,value:t.value===!0,"aria-label":`试算值:${t.name}`,"onUpdate:value":e=>r(`update-value`,t.field,e)},null,8,[`value`,`aria-label`,`onUpdate:value`])):e.editable&&t.type===`text`?(m(),i(v(D),{key:2,value:typeof t.value==`string`?t.value:``,"input-props":{id:`${l}-${t.field}`,"aria-label":`试算值:${t.name}`},"onUpdate:value":e=>r(`update-value`,t.field,e)},null,8,[`value`,`input-props`,`onUpdate:value`])):(m(),o(`span`,Ne,_(t.value??`未提供`),1)),t.description?(m(),o(`p`,Pe,_(t.description),1)):a(`v-if`,!0)]))),128)),e.usedVariables.length?a(`v-if`,!0):(m(),o(`p`,$,_(e.formula.trim()?`当前公式没有引用变量。`:`引用变量后,对应数据会出现在这里。`),1))]),d[2]||=s(`p`,{class:`formula-preview__note`},`试算值仅用于本次验证,修改不会写入业务数据。`,-1)]))}}),[[`__scopeId`,`data-v-b2656900`]]);const Ie={class:`c-formula__title-row`},Le={class:`c-formula__actions`},Re={key:0,class:`c-formula__templates`,"aria-label":`公式模板`},ze=[`disabled`,`aria-pressed`,`onClick`],Be={key:0,class:`c-formula__sidebar`},Ve={class:`c-formula__main`},He={key:0,class:`c-formula__keyboard`},Ue={class:`c-formula__guide`};var We=t(u({name:`C_FormulaEditor`,__name:`index`,props:{modelValue:{},config:{},variables:{},functions:{},sampleData:{},disabled:{type:Boolean,default:!1},placeholder:{},height:{},showPreview:{type:Boolean,default:!0},showKeyboard:{type:Boolean,default:!0},showVariablePanel:{type:Boolean,default:!0},editableSampleData:{type:Boolean,default:!0},templates:{}},emits:[`update:modelValue`,`change`,`validation-change`],setup(t,{expose:r,emit:u}){let d=t,y=u,{options:b,formula:x,analysis:w,evalResult:E,usedVariables:D,updateSample:O,reset:k}=J(d),A=h();S(x,e=>{y(`update:modelValue`,e),y(`change`,e)}),S(()=>w.value.validation,e=>y(`validation-change`,e),{immediate:!0});function M(e){b.value.disabled||(x.value=e)}function N(e){b.value.disabled||A.value?.insertAtCursor(e)}function P(e){b.value.disabled||(e===`BACKSPACE`&&A.value?.backspace(),e===`CLEAR`&&(x.value=``))}return r({getValue:()=>x.value,setValue:e=>{x.value=e},reset:k,validate:()=>w.value.validation,insertAtCursor:N,focus:()=>A.value?.focus()}),(t,r)=>(m(),o(`section`,{class:`c-formula`,style:p({height:typeof v(b).height==`number`?`${v(b).height}px`:v(b).height}),"aria-label":`公式编辑器`},[s(`header`,Ie,[r[4]||=s(`div`,null,[s(`span`,{class:`c-formula__eyebrow`},`FORMULA WORKBENCH`),s(`h2`,null,`规则与试算`),s(`p`,null,`插入变量、编辑公式,再用试算值验证结果。`)],-1),s(`div`,Le,[l(v(j),{type:v(x).trim()?v(w).validation.valid?`success`:`error`:`default`,size:`small`},{default:C(()=>[c(_(v(x).trim()?v(w).validation.valid?`语法有效`:`需要修正`:`等待输入`),1)]),_:1},8,[`type`]),l(v(T),{size:`small`,disabled:v(b).disabled,onClick:v(k)},{default:C(()=>[...r[3]||=[c(`重置`,-1)]]),_:1},8,[`disabled`,`onClick`])])]),v(b).templates.length?(m(),o(`div`,Re,[(m(!0),o(n,null,g(v(b).templates,e=>(m(),o(`button`,{key:e.value,type:`button`,disabled:v(b).disabled,"aria-pressed":v(x)===e.value,onClick:t=>x.value=e.value},[s(`strong`,null,_(e.label),1),s(`span`,null,_(e.description),1)],8,ze))),128))])):a(`v-if`,!0),s(`div`,{class:f([`c-formula__body`,{"c-formula__body--no-sidebar":!v(b).showVariablePanel,"c-formula__body--no-preview":!v(b).showPreview}])},[v(b).showVariablePanel?(m(),o(`aside`,Be,[l(he,{variables:v(b).variables,functions:v(b).functions,disabled:v(b).disabled,onSelectVariable:r[0]||=e=>N(`[${e.name}]`),onSelectFunction:r[1]||=e=>N(`${e.name}(`)},null,8,[`variables`,`functions`,`disabled`])])):a(`v-if`,!0),s(`div`,Ve,[l(Q,{ref_key:`formulaInputRef`,ref:A,formula:v(x),tokens:v(w).tokens,validation:v(w).validation,disabled:v(b).disabled,placeholder:v(b).placeholder,"onUpdate:formula":M},null,8,[`formula`,`tokens`,`validation`,`disabled`,`placeholder`]),v(b).showKeyboard?(m(),o(`details`,He,[r[5]||=s(`summary`,null,[c(`辅助键盘 `),s(`span`,null,`运算符、数字与退格`)],-1),l(we,{disabled:v(b).disabled,onKeyPress:r[2]||=e=>N(e.value),onAction:P},null,8,[`disabled`])])):a(`v-if`,!0),s(`div`,Ue,[l(e,{name:`mdi:information-outline`,size:16}),r[6]||=s(`p`,null,[c(`变量使用 `),s(`code`,null,`[变量名]`),c(`,支持括号、比较和条件函数。右侧结果是当前数据的本地试算。`)],-1)])]),v(b).showPreview?(m(),i(Fe,{key:1,formula:v(x),"eval-result":v(E),"used-variables":v(D),editable:v(b).editableSampleData&&!v(b).disabled,onUpdateValue:v(O)},null,8,[`formula`,`eval-result`,`used-variables`,`editable`,`onUpdateValue`])):a(`v-if`,!0)],2)],4))}}),[[`__scopeId`,`data-v-fdb8dd69`]]);function Ge(e){let t=r(()=>{let t=new Map;for(let n of e.value)t.set(n.name,n.field);return t}),n,i;function a(e,r){if(!e.trim())return{success:!0,result:void 0};try{return(!i||n!==e)&&(i=G(e),n=e),{success:!0,result:i.evaluate(t.value,r)}}catch(e){return{success:!1,result:void 0,error:e instanceof Error?e.message:String(e)}}}function o(e){try{return[...new Set(K(e).filter(e=>e.type===`variable`).map(e=>e.value))]}catch{return[]}}return{evaluate:a,extractVariableNames:o,variableMap:t}}export{F as a,M as c,P as i,I as l,We as n,N as o,q as r,ee as s,Ge as t};
2
+ `,r:`\r`,t:` `}[t]??t}else o+=t;n+=1}if(!s)throw Error(`第 ${a+1} 个字符处的字符串未闭合`);r({type:`string`,value:o,position:a});continue}let o=e.slice(n,n+2);if([`>=`,`<=`,`==`,`!=`].includes(o)){r({type:`operator`,value:o,position:n}),n+=2;continue}if(`+-*/%><?:`.includes(t)){r({type:`operator`,value:t,position:n}),n+=1;continue}if(`(),`.includes(t)){r({type:`punctuation`,value:t,position:n}),n+=1;continue}let s=/^[A-Za-z_][A-Za-z0-9_]*/.exec(i);if(s){let e=s[0],t=e.toUpperCase();r({type:[`AND`,`OR`,`NOT`].includes(t)?`operator`:`identifier`,value:[`AND`,`OR`,`NOT`].includes(t)?t:e,position:n}),n+=e.length;continue}throw Error(`第 ${n+1} 个字符“${t}”不受支持`)}return t.push({type:`eof`,value:``,position:n}),t}var te=class{cursor=0;nestingDepth=0;constructor(e){this.tokens=e}parse(){let e=this.parseConditional();return this.expect(`eof`),e}current(){return this.tokens[this.cursor]}advance(){return this.tokens[this.cursor++]}consume(e){return this.current().value===e?(this.advance(),!0):!1}expect(e,t){let n=this.current();if(n.type!==e||t!==void 0&&n.value!==t)throw Error(`第 ${n.position+1} 个字符处应为 ${t??e}`);return this.advance()}parseConditional(){if(++this.nestingDepth>100)throw Error(`公式嵌套不能超过 100 层`);try{let e=this.parseOr();if(!this.consume(`?`))return e;let t=this.parseConditional();return this.expect(`operator`,`:`),{kind:`conditional`,condition:e,truthy:t,falsy:this.parseConditional()}}finally{this.nestingDepth--}}parseBinary(e,t){let n=e();for(;t.includes(this.current().value);)n={kind:`binary`,operator:this.advance().value,left:n,right:e()};return n}parseOr(){return this.parseBinary(()=>this.parseAnd(),[`OR`])}parseAnd(){return this.parseBinary(()=>this.parseEquality(),[`AND`])}parseEquality(){return this.parseBinary(()=>this.parseComparison(),[`==`,`!=`])}parseComparison(){return this.parseBinary(()=>this.parseAdditive(),[`>`,`>=`,`<`,`<=`])}parseAdditive(){return this.parseBinary(()=>this.parseMultiplicative(),[`+`,`-`])}parseMultiplicative(){return this.parseBinary(()=>this.parseUnary(),[`*`,`/`,`%`])}parseUnary(){let e=[];for(;[`-`,`+`,`NOT`].includes(this.current().value)&&!(this.current().value===`NOT`&&this.tokens[this.cursor+1]?.value===`(`);)if(e.push(this.advance().value),e.length>100)throw Error(`一元运算不能超过 100 层`);let t=this.parsePrimary();for(let n of e.reverse())t={kind:`unary`,operator:n,value:t};return t}parsePrimary(){let e=this.current();if(e.type===`number`||e.type===`string`)return this.advance(),{kind:`literal`,value:e.type===`number`?Number(e.value):e.value};if(e.type===`variable`)return this.advance(),{kind:`variable`,name:e.value};if(e.type===`identifier`||e.type===`operator`&&[`AND`,`OR`,`NOT`].includes(e.value)){this.advance();let t=e.value.toUpperCase();if(t===`TRUE`||t===`FALSE`)return{kind:`literal`,value:t===`TRUE`};if(this.consume(`(`))return this.parseFunction(t,e);if(t===`NOT`)return{kind:`unary`,operator:`NOT`,value:this.parseUnary()};if(e.type===`identifier`)return{kind:`identifier`,name:e.value}}if(this.consume(`(`)){let e=this.parseConditional();return this.expect(`punctuation`,`)`),e}throw Error(`第 ${e.position+1} 个字符处缺少有效值`)}parseFunction(e,t){if(!Object.prototype.hasOwnProperty.call(z,e))throw Error(`第 ${t.position+1} 个字符处:未知函数“${t.value}”`);let n=[];if(!this.consume(`)`)){do n.push(this.parseConditional());while(this.consume(`,`));this.expect(`punctuation`,`)`)}let[r,i]=e===`IF`?[3,3]:e===`ROUND`?[1,2]:[`AND`,`OR`,`SUM`,`AVG`,`MAX`,`MIN`].includes(e)?[1,1/0]:[1,1];if(n.length<r||n.length>i)throw Error(`第 ${t.position+1} 个字符处:${e} 需要 ${r===i?r:`${r}–${i===1/0?`多个`:i}`} 个参数`);return{kind:`call`,name:e,args:n}}};function H(e,t){if(!Object.prototype.hasOwnProperty.call(t,e)||t[e]==null)throw Error(`变量“${e}”缺少样例数据`);let n=t[e];if(![`number`,`string`,`boolean`].includes(typeof n)||typeof n==`number`&&!Number.isFinite(n))throw Error(`变量“${e}”的数据类型不受支持`);return n}function U(e,t,n){switch(e){case`==`:return t===n;case`!=`:return t!==n;case`+`:return B(t)+B(n);case`-`:return B(t)-B(n);case`*`:return B(t)*B(n);case`/`:return B(t)/B(n);case`%`:return B(t)%B(n);default:if(typeof t==`boolean`||typeof n==`boolean`)throw Error(`运算符 ${e} 不支持布尔值`);return e===`>`?t>n:e===`>=`?t>=n:e===`<`?t<n:t<=n}}function W(e,t,n,r=0){if(r>200)throw Error(`公式计算层数超过安全限制`);let i=e=>W(e,t,n,r+1);switch(e.kind){case`literal`:return e.value;case`variable`:{let r=t.get(e.name);if(!r)throw Error(`未知变量“${e.name}”`);return H(r,n)}case`identifier`:return H(e.name,n);case`conditional`:return i(e.condition)?i(e.truthy):i(e.falsy);case`unary`:{let t=i(e.value);return e.operator===`NOT`?!t:e.operator===`-`?-B(t):B(t)}case`binary`:{let t=i(e.left);return e.operator===`AND`?!!t&&!!i(e.right):e.operator===`OR`?!!t||!!i(e.right):U(e.operator,t,i(e.right))}case`call`:return e.name===`IF`?i(e.args[0])?i(e.args[1]):i(e.args[2]):e.name===`AND`?e.args.every(e=>!!i(e)):e.name===`OR`?e.args.some(e=>!!i(e)):z[e.name](...e.args.map(i))}}function G(e){let t=V(e),n=new te(t).parse();return{tokens:t,evaluate(e,t){let r=W(n,e,t);if(typeof r==`number`&&!Number.isFinite(r))throw Error(`公式计算结果必须是有限数值`);return r}}}function K(e){return V(e)}function q(e,t){let n=r(()=>new Set(e.value.map(e=>e.name))),i=r(()=>new Set(e.value.map(e=>e.field))),a=r(()=>new Set(t.value.map(e=>e.name.toUpperCase()))),o=null;function s(e){try{let t=K(e),n=[],r=0;return t.forEach((i,a)=>{if(i.type===`eof`)return;i.position>r&&n.push({type:`space`,value:e.slice(r,i.position),start:r,end:i.position});let o=e.slice(i.position,t[a+1]?.position??e.length).trimEnd();r=i.position+o.length;let s=t[a+1],c=i.type===`variable`?`variable`:i.type===`number`?`number`:s?.value===`(`&&(i.type===`identifier`||[`AND`,`OR`,`NOT`].includes(i.value))?`function`:i.type===`operator`?`operator`:i.type===`punctuation`?i.value===`,`?`comma`:`paren`:`text`;n.push({type:c,value:c===`variable`?i.value:o,start:i.position,end:r})}),r<e.length&&n.push({type:`space`,value:e.slice(r),start:r,end:e.length}),n}catch{return e?[{type:`text`,value:e,start:0,end:e.length}]:[]}}function c(e){let t=n.value,r=i.value,c=a.value;if(o?.formula===e&&o.names===t&&o.fields===r&&o.functions===c)return o.analysis;let l={tokens:s(e),validation:{valid:!0,message:e.trim()?`语法校验通过`:`尚未输入公式`},compiled:null};if(e.trim())try{l.compiled=G(e);for(let e of l.tokens){if(e.type===`variable`&&!t.has(e.value))throw Error(`第 ${e.start+1} 个字符处:未知变量「${e.value}」`);if(e.type===`function`&&!c.has(e.value.toUpperCase()))throw Error(`第 ${e.start+1} 个字符处:未知函数「${e.value}」`);if(e.type===`text`&&/^[A-Za-z_]\w*$/.test(e.value)&&![`TRUE`,`FALSE`].includes(e.value.toUpperCase())&&!r.has(e.value))throw Error(`第 ${e.start+1} 个字符处:未知字段「${e.value}」`)}}catch(e){let t=e instanceof Error?e.message:String(e),n=/第 (\d+) 个字符/.exec(t);l.validation={valid:!1,message:t,...n?{position:Number(n[1])-1}:{}},l.compiled=null}return o={formula:e,names:t,fields:r,functions:c,analysis:l},l}function l(e){return c(e).validation}function u(e,t){let n=0,r=``;for(let i of s(e).filter(e=>e.type===`variable`))r+=e.slice(n,i.start)+(t.get(i.value)??`__unknown_${i.value}__`),n=i.end;return r+e.slice(n)}return{tokenize:s,analyze:c,validate:l,toEvalExpression:u,variableNames:n,functionNames:a}}function J(e){let t=r(()=>({variables:e.config?.variables??e.variables??[],functions:e.config?.functions??e.functions??F,sampleData:e.config?.sampleData??e.sampleData??{},disabled:e.config?.disabled??e.disabled??!1,placeholder:e.config?.placeholder??e.placeholder??`例如:[完成值] / [目标值] * 100`,height:e.config?.height??e.height??`auto`,showPreview:e.config?.showPreview??e.showPreview??!0,showKeyboard:e.config?.showKeyboard??e.showKeyboard??!0,showVariablePanel:e.config?.showVariablePanel??e.showVariablePanel??!0,editableSampleData:e.config?.editableSampleData??e.editableSampleData??!0,templates:e.config?.templates??e.templates??[]})),n=e.modelValue??``,i=h(n),a=h({}),o=q(r(()=>t.value.variables),r(()=>t.value.functions)),s=r(()=>o.analyze(i.value)),c=r(()=>{let e=new Map(Object.entries(t.value.sampleData));for(let[t,n]of Object.entries(a.value))n===null?e.delete(t):e.set(t,n);return Object.fromEntries(e)}),l=r(()=>new Map(t.value.variables.map(e=>[e.name,e.field]))),u=r(()=>{let e=s.value.tokens.filter(e=>e.type===`variable`).map(e=>e.value),n=s.value.tokens.filter(e=>e.type===`text`).map(e=>e.value);return t.value.variables.filter(t=>e.includes(t.name)||n.includes(t.field)).map(e=>({...e,value:c.value[e.field]}))}),d=r(()=>{if(!s.value.validation.valid)return{success:!1,result:void 0,error:s.value.validation.message};if(!s.value.compiled)return{success:!0,result:void 0};try{return{success:!0,result:s.value.compiled.evaluate(l.value,c.value)}}catch(e){return{success:!1,result:void 0,error:e instanceof Error?e.message:String(e)}}});function f(e,n){!t.value.disabled&&t.value.editableSampleData&&(a.value={...a.value,[e]:n})}function p(){i.value=n,a.value={}}return S(()=>e.modelValue,e=>{e!==void 0&&e!==i.value&&(i.value=e)}),S(()=>t.value.sampleData,()=>{a.value={}}),{options:t,formula:i,analysis:s,evalResult:d,usedVariables:u,updateSample:f,reset:p}}const Y={class:`formula-input__header`},X=[`readonly`,`aria-invalid`,`placeholder`],Z={key:0,class:`formula-input__tokens`,"aria-label":`公式结构预览`};var Q=t(u({name:`FormulaInput`,__name:`FormulaInput`,props:{formula:{},tokens:{},validation:{},variableNames:{},disabled:{type:Boolean,default:!1},placeholder:{default:`例如:[完成值] / [目标值] * 100`}},emits:[`update:formula`],setup(e,{expose:t,emit:r}){let i=e,c=r,l=h(),u=h(i.formula),p=`formula-feedback-${y()}`,v=u.value.length,x=v;S(u,e=>c(`update:formula`,e),{flush:`sync`}),S(()=>i.formula,e=>{e!==u.value&&(u.value=e,v=x=e.length)});function C(){l.value&&(v=l.value.selectionStart,x=l.value.selectionEnd)}function T(e,t=v,n=x){if(i.disabled)return;let r=Math.max(0,Math.min(t,u.value.length));u.value=u.value.slice(0,r)+e+u.value.slice(Math.max(r,n)),v=x=r+e.length,d(()=>{l.value?.focus({preventScroll:!0}),l.value?.setSelectionRange(v,x)})}function E(e){T(e)}function D(){if(v!==x){T(``);return}if(v===0)return;let e=i.tokens.find(e=>e.type===`variable`&&e.end===v),t=Array.from(u.value.slice(0,v)).pop()?.length??1;T(``,e?.start??v-t,x)}function O(){T(``,0,u.value.length)}function k(){v=x=u.value.length,l.value?.setSelectionRange(v,x)}function A(){l.value?.focus({preventScroll:!0}),k()}function j(){let e=i.validation.position??0;l.value?.focus({preventScroll:!0}),l.value?.setSelectionRange(e,Math.min(e+1,u.value.length)),C()}return t({insertAtCursor:E,backspace:D,clear:O,focus:A,moveCursorToEnd:k}),(t,r)=>(m(),o(`div`,{class:f([`formula-input`,{"formula-input--disabled":e.disabled,"formula-input--error":!e.validation.valid&&e.formula.trim()}])},[s(`div`,Y,[r[1]||=s(`span`,{class:`formula-input__label`},`01 / 编辑公式`,-1),e.formula.trim()&&!e.disabled?(m(),o(`button`,{key:0,type:`button`,class:`formula-input__clear`,onClick:O},`清空公式`)):a(`v-if`,!0)]),w(s(`textarea`,{ref_key:`editorRef`,ref:l,"onUpdate:modelValue":r[0]||=e=>u.value=e,class:`formula-input__editor`,readonly:e.disabled,"aria-label":`公式输入`,"aria-invalid":!e.validation.valid&&!!e.formula.trim(),"aria-describedby":p,placeholder:e.placeholder,spellcheck:`false`,onSelect:C,onClick:C,onKeyup:C,onBlur:C},null,40,X),[[b,u.value]]),e.tokens.length?(m(),o(`div`,Z,[r[2]||=s(`span`,{class:`formula-input__tokens-label`},`结构预览`,-1),(m(!0),o(n,null,g(e.tokens,(e,t)=>(m(),o(`span`,{key:t,class:f(`formula-token formula-token--${e.type}`)},_(e.type===`variable`?`[${e.value}]`:e.value),3))),128))])):a(`v-if`,!0),s(`div`,{id:p,class:`formula-input__validation`,role:`status`},[s(`span`,{class:f(e.formula.trim()?e.validation.valid?`formula-input__validation-success`:`formula-input__validation-error`:`formula-input__validation-hint`)},_(e.formula.trim()?e.validation.valid?`语法校验通过,可在右侧调整数据试算。`:e.validation.message:`点击左侧变量开始,也可以直接输入 [变量名]。`),3),e.validation.position===void 0?a(`v-if`,!0):(m(),o(`button`,{key:0,type:`button`,class:`formula-input__locate`,onClick:j},`定位错误`))])],2))}}),[[`__scopeId`,`data-v-5b2f30eb`]]);const ne={class:`variable-panel`},re={class:`variable-panel__tabs`},ie=[`aria-pressed`],ae=[`aria-pressed`],oe={class:`variable-panel__search`},se=[`aria-expanded`,`onClick`],ce={class:`variable-panel__items`},le=[`disabled`,`onClick`],ue={key:0},de=[`disabled`,`onClick`],fe={class:`variable-panel__func-name`},pe={class:`variable-panel__func-desc`},me={class:`variable-panel__func-sig`};var he=t(u({__name:`VariablePanel`,props:{variables:{},functions:{},disabled:{type:Boolean}},emits:[`select-variable`,`select-function`],setup(t){let u=t,d=h(`variable`),p=h(``),y=h(new Set),b=r(()=>{let e=p.value.toLowerCase(),t=e?u.variables.filter(t=>t.name.toLowerCase().includes(e)||t.field.toLowerCase().includes(e)||(t.description??``).toLowerCase().includes(e)):u.variables,n=new Map;for(let e of t){let t=e.group??`其他`,r=n.get(t);r?r.push(e):n.set(t,[e])}return Array.from(n,([e,t])=>({name:e,items:t}))});S(b,e=>{for(let t of e)y.value.add(t.name)},{immediate:!0});function T(e){y.value.has(e)?y.value.delete(e):y.value.add(e)}let O=r(()=>{let e=p.value.toLowerCase();return e?u.functions.filter(t=>t.name.toLowerCase().includes(e)||t.description.toLowerCase().includes(e)):u.functions});function A(e){switch(e){case`number`:return`mdi:numeric`;case`text`:return`mdi:format-text`;case`boolean`:return`mdi:toggle-switch-outline`;default:return`mdi:variable`}}return(r,u)=>(m(),o(`div`,ne,[a(` 切换 Tab:变量 / 函数 `),s(`div`,re,[s(`button`,{type:`button`,class:f([`variable-panel__tab`,{"variable-panel__tab--active":d.value===`variable`}]),"aria-pressed":d.value===`variable`,onClick:u[0]||=e=>d.value=`variable`},` 可用变量 `,10,ie),s(`button`,{type:`button`,class:f([`variable-panel__tab`,{"variable-panel__tab--active":d.value===`function`}]),"aria-pressed":d.value===`function`,onClick:u[1]||=e=>d.value=`function`},` 常用函数 `,10,ae)]),a(` 搜索框 `),s(`div`,oe,[l(v(D),{value:p.value,"onUpdate:value":u[2]||=e=>p.value=e,size:`small`,placeholder:`搜索变量或函数`,"input-props":{"aria-label":`搜索变量或函数`},clearable:``},{prefix:C(()=>[l(e,{name:`mdi:magnify`,size:16})]),_:1},8,[`value`])]),a(` 变量列表 `),d.value===`variable`?(m(),i(v(k),{key:0,class:`variable-panel__list`},{default:C(()=>[b.value.length>0?(m(!0),o(n,{key:0},g(b.value,i=>(m(),o(`div`,{key:i.name,class:`variable-panel__group`},[s(`button`,{type:`button`,class:`variable-panel__group-title`,"aria-expanded":y.value.has(i.name),onClick:e=>T(i.name)},[l(e,{name:y.value.has(i.name)?`mdi:chevron-down`:`mdi:chevron-right`,size:16},null,8,[`name`]),c(` `+_(i.name),1)],8,se),w(s(`div`,ce,[(m(!0),o(n,null,g(i.items,n=>(m(),o(`button`,{key:n.field,type:`button`,class:`variable-panel__item`,disabled:t.disabled,onClick:e=>r.$emit(`select-variable`,n)},[l(e,{name:A(n.type),size:15,class:`variable-panel__item-icon`},null,8,[`name`]),s(`span`,null,[c(_(n.name),1),n.description?(m(),o(`small`,ue,_(n.description),1)):a(`v-if`,!0)])],8,le))),128))],512),[[x,y.value.has(i.name)]])]))),128)):(m(),i(v(E),{key:1,size:`small`,description:`无匹配变量`}))]),_:1})):(m(),o(n,{key:1},[a(` 函数列表 `),l(v(k),{class:`variable-panel__list`},{default:C(()=>[O.value.length>0?(m(!0),o(n,{key:0},g(O.value,e=>(m(),o(`button`,{key:e.name,type:`button`,class:`variable-panel__func`,disabled:t.disabled,onClick:t=>r.$emit(`select-function`,e)},[s(`div`,fe,[u[3]||=s(`span`,{class:`variable-panel__func-badge`},`ƒ`,-1),c(` `+_(e.name),1)]),s(`div`,pe,_(e.description),1),s(`div`,me,_(e.signature),1)],8,de))),128)):(m(),i(v(E),{key:1,size:`small`,description:`无匹配函数`}))]),_:1})],2112))]))}}),[[`__scopeId`,`data-v-2d73fec7`]]);const ge={class:`virtual-keyboard`,role:`group`,"aria-label":`公式键盘`},_e={key:0,class:`virtual-keyboard__functions`},ve={class:`virtual-keyboard__function-grid`},ye=[`disabled`,`title`,`aria-label`,`onClick`],be={class:`virtual-keyboard__body`},xe={class:`virtual-keyboard__operators`},Se={class:`virtual-keyboard__label`},Ce=[`disabled`,`aria-label`,`onClick`],we={class:`virtual-keyboard__numbers`},Te={class:`virtual-keyboard__keys virtual-keyboard__keys--numbers`},Ee=[`disabled`,`aria-label`,`onClick`],De={class:`virtual-keyboard__footer`},Oe={class:`virtual-keyboard__actions`},ke=[`disabled`,`aria-label`,`onClick`];var Ae=t(u({name:`VirtualKeyboard`,__name:`VirtualKeyboard`,props:{disabled:{type:Boolean,default:!1},functions:{default:()=>[]}},emits:[`key-press`,`insert-function`,`action`],setup(t){let r=N.filter(e=>e.type===`number`),i=P.map(e=>({...e,label:e.value===`BACKSPACE`?`退格`:e.label,icon:e.value===`BACKSPACE`?`M9 4h12v16H9L2 12zM9.9 6 4.6 12l5.3 6H19V6zM11 8l6 6-1.4 1.4-6-6zM15.6 8 17 9.4l-6 6-1.4-1.4z`:`M5 5h14v2H5zM9 2h6v2H9zM7 8h2v11h6V8h2v13H7zM10 8h1v9h-1zM13 8h1v9h-1z`})),u=[{name:`arithmetic`,label:`四则与取余`,keys:[...N,...M].filter(e=>e.type===`operator`)},{name:`compare`,label:`比较判断`,keys:M.filter(e=>e.type===`compare`)},{name:`logic`,label:`括号与条件`,keys:M.filter(e=>e.type===`paren`||e.type===`logic`)}];return(d,p)=>(m(),o(`div`,ge,[t.functions.length?(m(),o(`div`,_e,[p[1]||=s(`span`,{class:`virtual-keyboard__label`},`函数快捷输入`,-1),s(`div`,ve,[(m(!0),o(n,null,g(t.functions,e=>(m(),o(`button`,{key:e.name,type:`button`,class:`virtual-keyboard__function`,disabled:t.disabled,title:`${e.signature} · ${e.description}`,"aria-label":`插入函数 ${e.name}`,onClick:t=>d.$emit(`insert-function`,e)},[c(_(e.name),1),p[0]||=s(`span`,null,`( )`,-1)],8,ye))),128))])])):a(`v-if`,!0),s(`div`,be,[s(`div`,xe,[(m(),o(n,null,g(u,e=>s(`section`,{key:e.label,class:`virtual-keyboard__group`},[s(`h3`,Se,_(e.label),1),s(`div`,{class:f([`virtual-keyboard__keys`,`virtual-keyboard__keys--${e.name}`])},[(m(!0),o(n,null,g(e.keys,e=>(m(),o(`button`,{key:e.value,type:`button`,class:f([`virtual-keyboard__key`,e.color&&`virtual-keyboard__key--${e.color}`]),disabled:t.disabled,"aria-label":`插入 ${e.label}`,onClick:t=>d.$emit(`key-press`,e)},_(e.label),11,Ce))),128))],2)])),64))]),s(`section`,we,[p[2]||=s(`h3`,{class:`virtual-keyboard__label`},`数字输入`,-1),s(`div`,Te,[(m(!0),o(n,null,g(v(r),e=>(m(),o(`button`,{key:e.value,type:`button`,class:f([`virtual-keyboard__key`,{"virtual-keyboard__key--zero":e.value===`0`}]),disabled:t.disabled,"aria-label":`输入 ${e.label}`,onClick:t=>d.$emit(`key-press`,e)},_(e.label),11,Ee))),128))])])]),s(`footer`,De,[p[3]||=s(`span`,null,`按键会插入到光标处,选中文字可直接替换。`,-1),s(`div`,Oe,[(m(!0),o(n,null,g(v(i),n=>(m(),o(`button`,{key:n.value,type:`button`,class:f([`virtual-keyboard__action`,{"virtual-keyboard__action--clear":n.value===`CLEAR`}]),disabled:t.disabled,"aria-label":n.label,onClick:e=>d.$emit(`action`,n.value)},[l(e,{type:`svg`,"svg-path":n.icon,size:16},null,8,[`svg-path`]),c(_(n.label),1)],10,ke))),128))])])]))}}),[[`__scopeId`,`data-v-05f0982d`]]);const je={class:`formula-preview`,"aria-label":`公式试算`},Me={class:`formula-preview__result-label`},Ne={key:0,class:`formula-preview__result-value`},Pe={key:1,class:`formula-preview__result-empty`},Fe={class:`formula-preview__vars`},Ie={class:`formula-preview__vars-title`},Le={class:`formula-preview__var-heading`},Re=[`for`],ze={key:3,class:`formula-preview__var-value`},Be={key:4},Ve={key:0,class:`formula-preview__empty`};var $=t(u({name:`FormulaPreview`,__name:`FormulaPreview`,props:{formula:{},evalResult:{},usedVariables:{},editable:{type:Boolean}},emits:[`update-value`],setup(e,{emit:t}){let r=t,l=`formula-sample-${y()}`;function u(e){return typeof e==`number`?new Intl.NumberFormat(void 0,{maximumFractionDigits:6}).format(e):typeof e==`boolean`?e?`真 · true`:`假 · false`:String(e)}return(t,d)=>(m(),o(`aside`,je,[d[1]||=s(`header`,null,[s(`span`,{class:`formula-preview__step`},`02`),s(`div`,null,[s(`h3`,null,`验证计算结果`),s(`p`,null,`调整试算值,观察规则是否符合预期。`)])],-1),s(`div`,{class:f([`formula-preview__result`,{"formula-preview__result--error":!!e.evalResult.error}]),role:`status`,"aria-live":`polite`},[s(`span`,Me,_(e.evalResult.error?`暂时无法计算`:`试算结果`),1),e.evalResult.success&&e.evalResult.result!==void 0?(m(),o(`output`,Ne,_(u(e.evalResult.result)),1)):(m(),o(`span`,Pe,_(e.formula.trim()?e.evalResult.error||`等待数据`:`输入公式后展示结果`),1))],2),s(`div`,Fe,[s(`div`,Ie,[d[0]||=c(`本次使用的试算值 `,-1),s(`span`,null,_(e.usedVariables.length)+` 项`,1)]),(m(!0),o(n,null,g(e.usedVariables,t=>(m(),o(`div`,{key:t.field,class:`formula-preview__var-row`},[s(`div`,Le,[s(`label`,{for:`${l}-${t.field}`},_(t.name),9,Re),s(`code`,null,_(t.field),1)]),e.editable&&t.type===`number`?(m(),i(v(O),{key:0,value:typeof t.value==`number`?t.value:null,"input-props":{id:`${l}-${t.field}`,"aria-label":`试算值:${t.name}`},placeholder:`请输入数值`,"onUpdate:value":e=>r(`update-value`,t.field,e)},null,8,[`value`,`input-props`,`onUpdate:value`])):e.editable&&t.type===`boolean`?(m(),i(v(A),{key:1,value:t.value===!0,"aria-label":`试算值:${t.name}`,"onUpdate:value":e=>r(`update-value`,t.field,e)},null,8,[`value`,`aria-label`,`onUpdate:value`])):e.editable&&t.type===`text`?(m(),i(v(D),{key:2,value:typeof t.value==`string`?t.value:``,"input-props":{id:`${l}-${t.field}`,"aria-label":`试算值:${t.name}`},"onUpdate:value":e=>r(`update-value`,t.field,e)},null,8,[`value`,`input-props`,`onUpdate:value`])):(m(),o(`span`,ze,_(t.value??`未提供`),1)),t.description?(m(),o(`p`,Be,_(t.description),1)):a(`v-if`,!0)]))),128)),e.usedVariables.length?a(`v-if`,!0):(m(),o(`p`,Ve,_(e.formula.trim()?`当前公式没有引用变量。`:`引用变量后,对应数据会出现在这里。`),1))]),d[2]||=s(`p`,{class:`formula-preview__note`},`试算值仅用于本次验证,修改不会写入业务数据。`,-1)]))}}),[[`__scopeId`,`data-v-b2656900`]]);const He={class:`c-formula__title-row`},Ue={class:`c-formula__actions`},We={key:0,class:`c-formula__templates`,"aria-label":`公式模板`},Ge=[`disabled`,`aria-pressed`,`onClick`],Ke={key:0,class:`c-formula__sidebar`},qe={class:`c-formula__main`},Je={key:0,class:`c-formula__keyboard`,open:``},Ye={class:`c-formula__guide`};var Xe=t(u({name:`C_FormulaEditor`,__name:`index`,props:{modelValue:{},config:{},variables:{},functions:{},sampleData:{},disabled:{type:Boolean,default:!1},placeholder:{},height:{},showPreview:{type:Boolean,default:!0},showKeyboard:{type:Boolean,default:!0},showVariablePanel:{type:Boolean,default:!0},editableSampleData:{type:Boolean,default:!0},templates:{}},emits:[`update:modelValue`,`change`,`validation-change`],setup(t,{expose:r,emit:u}){let d=t,y=u,{options:b,formula:x,analysis:w,evalResult:E,usedVariables:D,updateSample:O,reset:k}=J(d),A=h();S(x,e=>{y(`update:modelValue`,e),y(`change`,e)}),S(()=>w.value.validation,e=>y(`validation-change`,e),{immediate:!0});function M(e){b.value.disabled||(x.value=e)}function N(e){b.value.disabled||A.value?.insertAtCursor(e)}function P(e){b.value.disabled||(e===`BACKSPACE`&&A.value?.backspace(),e===`CLEAR`&&A.value?.clear())}return r({getValue:()=>x.value,setValue:e=>{x.value=e},reset:k,validate:()=>w.value.validation,insertAtCursor:N,focus:()=>A.value?.focus()}),(t,r)=>(m(),o(`section`,{class:`c-formula`,style:p({height:typeof v(b).height==`number`?`${v(b).height}px`:v(b).height}),"aria-label":`公式编辑器`},[s(`header`,He,[r[5]||=s(`div`,null,[s(`span`,{class:`c-formula__eyebrow`},`FORMULA WORKBENCH`),s(`h2`,null,`规则与试算`),s(`p`,null,`插入变量、编辑公式,再用试算值验证结果。`)],-1),s(`div`,Ue,[l(v(j),{type:v(x).trim()?v(w).validation.valid?`success`:`error`:`default`,size:`small`},{default:C(()=>[c(_(v(x).trim()?v(w).validation.valid?`语法有效`:`需要修正`:`等待输入`),1)]),_:1},8,[`type`]),l(v(T),{size:`small`,disabled:v(b).disabled,onClick:v(k)},{default:C(()=>[...r[4]||=[c(`重置`,-1)]]),_:1},8,[`disabled`,`onClick`])])]),v(b).templates.length?(m(),o(`div`,We,[(m(!0),o(n,null,g(v(b).templates,e=>(m(),o(`button`,{key:e.value,type:`button`,disabled:v(b).disabled,"aria-pressed":v(x)===e.value,onClick:t=>x.value=e.value},[s(`strong`,null,_(e.label),1),s(`span`,null,_(e.description),1)],8,Ge))),128))])):a(`v-if`,!0),s(`div`,{class:f([`c-formula__body`,{"c-formula__body--no-sidebar":!v(b).showVariablePanel,"c-formula__body--no-preview":!v(b).showPreview}])},[v(b).showVariablePanel?(m(),o(`aside`,Ke,[l(he,{variables:v(b).variables,functions:v(b).functions,disabled:v(b).disabled,onSelectVariable:r[0]||=e=>N(`[${e.name}]`),onSelectFunction:r[1]||=e=>N(`${e.name}(`)},null,8,[`variables`,`functions`,`disabled`])])):a(`v-if`,!0),s(`div`,qe,[l(Q,{ref_key:`formulaInputRef`,ref:A,formula:v(x),tokens:v(w).tokens,validation:v(w).validation,disabled:v(b).disabled,placeholder:v(b).placeholder,"onUpdate:formula":M},null,8,[`formula`,`tokens`,`validation`,`disabled`,`placeholder`]),v(b).showKeyboard?(m(),o(`details`,Je,[s(`summary`,null,[l(e,{type:`svg`,"svg-path":`M4 5h16v14H4zM6 7v10h12V7zM7 8h2v2H7zM10 8h2v2h-2zM13 8h2v2h-2zM16 8h1v2h-1zM7 11h2v2H7zM10 11h2v2h-2zM13 11h2v2h-2zM16 11h1v2h-1zM8 14h8v2H8z`,size:18}),r[6]||=s(`span`,{class:`c-formula__keyboard-title`},[c(`公式键盘`),s(`small`,null,`数字、运算与函数 · 点击插入`)],-1),l(e,{class:`c-formula__keyboard-chevron`,type:`svg`,"svg-path":`M6 8l6 6 6-6 1.4 1.4L12 16.8 4.6 9.4z`,size:18})]),l(Ae,{disabled:v(b).disabled,functions:v(b).functions,onKeyPress:r[2]||=e=>N(e.value),onInsertFunction:r[3]||=e=>N(`${e.name}(`),onAction:P},null,8,[`disabled`,`functions`])])):a(`v-if`,!0),s(`div`,Ye,[l(e,{name:`mdi:information-outline`,size:16}),r[7]||=s(`p`,null,[c(`变量使用 `),s(`code`,null,`[变量名]`),c(`,支持括号、比较和条件函数。右侧结果是当前数据的本地试算。`)],-1)])]),v(b).showPreview?(m(),i($,{key:1,formula:v(x),"eval-result":v(E),"used-variables":v(D),editable:v(b).editableSampleData&&!v(b).disabled,onUpdateValue:v(O)},null,8,[`formula`,`eval-result`,`used-variables`,`editable`,`onUpdateValue`])):a(`v-if`,!0)],2)],4))}}),[[`__scopeId`,`data-v-b006a294`]]);function Ze(e){let t=r(()=>{let t=new Map;for(let n of e.value)t.set(n.name,n.field);return t}),n,i;function a(e,r){if(!e.trim())return{success:!0,result:void 0};try{return(!i||n!==e)&&(i=G(e),n=e),{success:!0,result:i.evaluate(t.value,r)}}catch(e){return{success:!1,result:void 0,error:e instanceof Error?e.message:String(e)}}}function o(e){try{return[...new Set(K(e).filter(e=>e.type===`variable`).map(e=>e.value))]}catch{return[]}}return{evaluate:a,extractVariableNames:o,variableMap:t}}export{F as a,M as c,P as i,I as l,Xe as n,N as o,q as r,ee as s,Ze as t};
@@ -51,8 +51,8 @@ declare const __VLS_export: vue.DefineComponent<Props, {
51
51
  openDialog: () => Promise<void>;
52
52
  closeDialog: () => void;
53
53
  }, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<Props> & Readonly<{}>, {
54
- placeholder: string;
55
54
  emptyText: string;
55
+ placeholder: string;
56
56
  resultGroupTitle: string;
57
57
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
58
58
  declare const _default: typeof __VLS_export;