@xw-components/formula-editor 18.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,9 @@
1
+ export const ICONS = {
2
+ cheng: `<svg class="icon" width="16px" height="16px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M460.8 896c-7.1 0-12.8-5.7-12.8-12.8V614.8L268.8 794c-5 5-13.1 5.1-18.1 0.1l-0.1-0.1-49.5-49.8c-5-5-5.1-13.1-0.1-18.1l0.1-0.1L383 544.1H140.8c-7.1 0-12.8-5.7-12.8-12.8v-70.4c0-7.1 5.7-12.8 12.8-12.8h239.4L200.9 268.9c-5-5-5.1-13.1-0.1-18.1l0.1-0.1 49.5-49.8c5-5 13.1-5.1 18.1-0.1l0.1 0.1 179.2 179.2V140.8c0-7.1 5.7-12.8 12.8-12.8H531c7.1 0 12.8 5.7 12.8 12.8v242.3L725.9 201c5-4.9 12.9-4.9 17.9 0l49.8 49.8c5 5 5.1 13.1 0.1 18.1l-0.1 0.1-179.2 179.1h268.4c7.1 0 12.8 5.7 12.8 12.8v70.4c0 7.1-5.7 12.8-12.8 12.8H611.6L793.5 726c5 5 5.1 13.1 0.1 18.1l-0.1 0.1-49.8 49.8c-5 4.9-12.9 4.9-17.9 0L543.7 611.8v271.6c0 7.1-5.7 12.8-12.8 12.8l-70.1-0.2z" /></svg>`,
3
+ chu: `<svg class="icon" width="16px" height="16px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M808.3 283.6L283.6 808.3c-5 5-13.1 5-18.1 0l-49.8-49.8c-5-5-5-13.1 0-18.1l524.7-524.7c5-5 13.1-5 18.1 0l49.8 49.8c4.9 5 4.9 13.1 0 18.1z" /></svg>`,
4
+ jia: `<svg class="icon" width="16px" height="16px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M476.8 896c-7.1 0-12.8-5.7-12.8-12.8V560H140.8c-7.1 0-12.8-5.7-12.8-12.8v-70.4c0-7.1 5.7-12.8 12.8-12.8H464V140.8c0-7.1 5.7-12.8 12.8-12.8h70.4c7.1 0 12.8 5.7 12.8 12.8V464h323.2c7.1 0 12.8 5.7 12.8 12.8v70.4c0 7.1-5.7 12.8-12.8 12.8H560v323.2c-0.2 7-5.8 12.7-12.8 12.8h-70.4z" /></svg>`,
5
+ jian: `<svg class="icon" width="16px" height="16px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M140.8 464h742.4c7.1 0 12.8 5.7 12.8 12.8v70.4c0 7.1-5.7 12.8-12.8 12.8H140.8c-7.1 0-12.8-5.7-12.8-12.8v-70.4c0-7.1 5.7-12.8 12.8-12.8z" /></svg>`,
6
+ youkuohao: `<svg class="icon" width="16px" height="16px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M416 163c38.7 49.3 68.8 104.8 88.9 164.1 19.8 59.6 29.7 122.1 29.3 184.9 1.1 62.3-8.5 124.2-28.4 183.2-23.2 59.2-53.3 115.4-89.8 167.4l56.9 33.3c42.9-56 76.8-118.4 100.4-184.9 23.2-64.1 34.9-131.8 34.7-199.9 0.3-69.3-11.4-138-34.7-203.3-23.2-65-57.2-125.8-100.4-179.8L416 163z" /></svg>`,
7
+ zuokuohao: `<svg class="icon" width="16px" height="16px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M608 163c-38.7 49.3-68.8 104.8-88.9 164.1-19.8 59.6-29.7 122.1-29.3 184.9-1.1 62.3 8.5 124.2 28.4 183.2 23.1 59.2 53.2 115.4 89.6 167.4L550.9 896c-42.8-56-76.6-118.4-100.2-184.9-23.2-64.1-34.9-131.8-34.7-199.9-0.3-69.3 11.4-138 34.7-203.3C473.9 242.8 507.9 182 551.1 128l56.9 35z" /></svg>`
8
+ };
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS1lZGl0b3ItaWNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvbXBvbmVudHMvZm9ybXVsYS1lZGl0b3IvZm9ybXVsYS1lZGl0b3ItaWNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUc7SUFDbkIsS0FBSyxFQUFFLGd4QkFBZ3hCO0lBQ3Z4QixHQUFHLEVBQUUsbVJBQW1SO0lBQ3hSLEdBQUcsRUFBRSwrWkFBK1o7SUFDcGEsSUFBSSxFQUFFLGtSQUFrUjtJQUN4UixTQUFTLEVBQUUsK1pBQStaO0lBQzFhLFNBQVMsRUFBRSxrYUFBa2E7Q0FDOWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBJQ09OUyA9IHtcclxuICBjaGVuZzogYDxzdmcgY2xhc3M9XCJpY29uXCIgd2lkdGg9XCIxNnB4XCIgaGVpZ2h0PVwiMTZweFwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTQ2MC44IDg5NmMtNy4xIDAtMTIuOC01LjctMTIuOC0xMi44VjYxNC44TDI2OC44IDc5NGMtNSA1LTEzLjEgNS4xLTE4LjEgMC4xbC0wLjEtMC4xLTQ5LjUtNDkuOGMtNS01LTUuMS0xMy4xLTAuMS0xOC4xbDAuMS0wLjFMMzgzIDU0NC4xSDE0MC44Yy03LjEgMC0xMi44LTUuNy0xMi44LTEyLjh2LTcwLjRjMC03LjEgNS43LTEyLjggMTIuOC0xMi44aDIzOS40TDIwMC45IDI2OC45Yy01LTUtNS4xLTEzLjEtMC4xLTE4LjFsMC4xLTAuMSA0OS41LTQ5LjhjNS01IDEzLjEtNS4xIDE4LjEtMC4xbDAuMSAwLjEgMTc5LjIgMTc5LjJWMTQwLjhjMC03LjEgNS43LTEyLjggMTIuOC0xMi44SDUzMWM3LjEgMCAxMi44IDUuNyAxMi44IDEyLjh2MjQyLjNMNzI1LjkgMjAxYzUtNC45IDEyLjktNC45IDE3LjkgMGw0OS44IDQ5LjhjNSA1IDUuMSAxMy4xIDAuMSAxOC4xbC0wLjEgMC4xLTE3OS4yIDE3OS4xaDI2OC40YzcuMSAwIDEyLjggNS43IDEyLjggMTIuOHY3MC40YzAgNy4xLTUuNyAxMi44LTEyLjggMTIuOEg2MTEuNkw3OTMuNSA3MjZjNSA1IDUuMSAxMy4xIDAuMSAxOC4xbC0wLjEgMC4xLTQ5LjggNDkuOGMtNSA0LjktMTIuOSA0LjktMTcuOSAwTDU0My43IDYxMS44djI3MS42YzAgNy4xLTUuNyAxMi44LTEyLjggMTIuOGwtNzAuMS0wLjJ6XCIgLz48L3N2Zz5gLFxyXG4gIGNodTogYDxzdmcgY2xhc3M9XCJpY29uXCIgd2lkdGg9XCIxNnB4XCIgaGVpZ2h0PVwiMTZweFwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTgwOC4zIDI4My42TDI4My42IDgwOC4zYy01IDUtMTMuMSA1LTE4LjEgMGwtNDkuOC00OS44Yy01LTUtNS0xMy4xIDAtMTguMWw1MjQuNy01MjQuN2M1LTUgMTMuMS01IDE4LjEgMGw0OS44IDQ5LjhjNC45IDUgNC45IDEzLjEgMCAxOC4xelwiIC8+PC9zdmc+YCxcclxuICBqaWE6IGA8c3ZnIGNsYXNzPVwiaWNvblwiIHdpZHRoPVwiMTZweFwiIGhlaWdodD1cIjE2cHhcIiB2aWV3Qm94PVwiMCAwIDEwMjQgMTAyNFwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk00NzYuOCA4OTZjLTcuMSAwLTEyLjgtNS43LTEyLjgtMTIuOFY1NjBIMTQwLjhjLTcuMSAwLTEyLjgtNS43LTEyLjgtMTIuOHYtNzAuNGMwLTcuMSA1LjctMTIuOCAxMi44LTEyLjhINDY0VjE0MC44YzAtNy4xIDUuNy0xMi44IDEyLjgtMTIuOGg3MC40YzcuMSAwIDEyLjggNS43IDEyLjggMTIuOFY0NjRoMzIzLjJjNy4xIDAgMTIuOCA1LjcgMTIuOCAxMi44djcwLjRjMCA3LjEtNS43IDEyLjgtMTIuOCAxMi44SDU2MHYzMjMuMmMtMC4yIDctNS44IDEyLjctMTIuOCAxMi44aC03MC40elwiIC8+PC9zdmc+YCxcclxuICBqaWFuOiBgPHN2ZyBjbGFzcz1cImljb25cIiB3aWR0aD1cIjE2cHhcIiBoZWlnaHQ9XCIxNnB4XCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMTQwLjggNDY0aDc0Mi40YzcuMSAwIDEyLjggNS43IDEyLjggMTIuOHY3MC40YzAgNy4xLTUuNyAxMi44LTEyLjggMTIuOEgxNDAuOGMtNy4xIDAtMTIuOC01LjctMTIuOC0xMi44di03MC40YzAtNy4xIDUuNy0xMi44IDEyLjgtMTIuOHpcIiAvPjwvc3ZnPmAsXHJcbiAgeW91a3VvaGFvOiBgPHN2ZyBjbGFzcz1cImljb25cIiB3aWR0aD1cIjE2cHhcIiBoZWlnaHQ9XCIxNnB4XCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNDE2IDE2M2MzOC43IDQ5LjMgNjguOCAxMDQuOCA4OC45IDE2NC4xIDE5LjggNTkuNiAyOS43IDEyMi4xIDI5LjMgMTg0LjkgMS4xIDYyLjMtOC41IDEyNC4yLTI4LjQgMTgzLjItMjMuMiA1OS4yLTUzLjMgMTE1LjQtODkuOCAxNjcuNGw1Ni45IDMzLjNjNDIuOS01NiA3Ni44LTExOC40IDEwMC40LTE4NC45IDIzLjItNjQuMSAzNC45LTEzMS44IDM0LjctMTk5LjkgMC4zLTY5LjMtMTEuNC0xMzgtMzQuNy0yMDMuMy0yMy4yLTY1LTU3LjItMTI1LjgtMTAwLjQtMTc5LjhMNDE2IDE2M3pcIiAvPjwvc3ZnPmAsXHJcbiAgenVva3VvaGFvOiBgPHN2ZyBjbGFzcz1cImljb25cIiB3aWR0aD1cIjE2cHhcIiBoZWlnaHQ9XCIxNnB4XCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNjA4IDE2M2MtMzguNyA0OS4zLTY4LjggMTA0LjgtODguOSAxNjQuMS0xOS44IDU5LjYtMjkuNyAxMjIuMS0yOS4zIDE4NC45LTEuMSA2Mi4zIDguNSAxMjQuMiAyOC40IDE4My4yIDIzLjEgNTkuMiA1My4yIDExNS40IDg5LjYgMTY3LjRMNTUwLjkgODk2Yy00Mi44LTU2LTc2LjYtMTE4LjQtMTAwLjItMTg0LjktMjMuMi02NC4xLTM0LjktMTMxLjgtMzQuNy0xOTkuOS0wLjMtNjkuMyAxMS40LTEzOCAzNC43LTIwMy4zQzQ3My45IDI0Mi44IDUwNy45IDE4MiA1NTEuMSAxMjhsNTYuOSAzNXpcIiAvPjwvc3ZnPmBcclxufTtcclxuIl19
@@ -0,0 +1,18 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export const FormulaEditorRequestServiceToken = new InjectionToken('FormulaEditorRequestServiceToken');
3
+ /**
4
+ * 公式编辑器请求服务,用于获取函数列表、字段列表、指标列表和校验公式格式
5
+ * 实现类需要实现四个方法。如果有部分方法不需要,可以实现空方法。
6
+ */
7
+ export class FormulaEditorRequestService {
8
+ constructor() { }
9
+ /**
10
+ * 获取字段的描述
11
+ * @param item 字段对象
12
+ * @returns 描述字符串
13
+ */
14
+ getFieldDescription() {
15
+ return Promise.resolve('');
16
+ }
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS1lZGl0b3ItcmVxdWVzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29tcG9uZW50cy9mb3JtdWxhLWVkaXRvci9mb3JtdWxhLWVkaXRvci1yZXF1ZXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU8vQyxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLGNBQWMsQ0FBOEIsa0NBQWtDLENBQUMsQ0FBQztBQUVwSTs7O0dBR0c7QUFDSCxNQUFNLE9BQWdCLDJCQUEyQjtJQUMvQyxnQkFBZSxDQUFDO0lBbUJoQjs7OztPQUlHO0lBQ0gsbUJBQW1CO1FBQ2pCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnpTYWZlQW55IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IE56VHJlZU5vZGVPcHRpb25zIH0gZnJvbSAnbmctem9ycm8tYW50ZC90cmVlJztcblxuaW1wb3J0IHsgRmllbGQsIEZ1bmMsIEl0ZW1UeXBlIH0gZnJvbSAnLi9mb3JtdWxhLWVkaXRvci5tb2RlbCc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi9mb3JtdWxhLWVkaXRvci5zZXJ2aWNlJztcblxuZXhwb3J0IGNvbnN0IEZvcm11bGFFZGl0b3JSZXF1ZXN0U2VydmljZVRva2VuID0gbmV3IEluamVjdGlvblRva2VuPEZvcm11bGFFZGl0b3JSZXF1ZXN0U2VydmljZT4oJ0Zvcm11bGFFZGl0b3JSZXF1ZXN0U2VydmljZVRva2VuJyk7XG5cbi8qKlxuICog5YWs5byP57yW6L6R5Zmo6K+35rGC5pyN5Yqh77yM55So5LqO6I635Y+W5Ye95pWw5YiX6KGo44CB5a2X5q615YiX6KGo44CB5oyH5qCH5YiX6KGo5ZKM5qCh6aqM5YWs5byP5qC85byPXG4gKiDlrp7njrDnsbvpnIDopoHlrp7njrDlm5vkuKrmlrnms5XjgILlpoLmnpzmnInpg6jliIbmlrnms5XkuI3pnIDopoHvvIzlj6/ku6Xlrp7njrDnqbrmlrnms5XjgIJcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm11bGFFZGl0b3JSZXF1ZXN0U2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICog6I635Y+W5Ye95pWw5YiX6KGoXG4gICAqL1xuICBhYnN0cmFjdCBnZXRGdW5jdGlvbnMoKTogUHJvbWlzZTxOelRyZWVOb2RlT3B0aW9uc1tdPjtcblxuICAvKipcbiAgICog6I635Y+W5a2X5q615YiX6KGoXG4gICAqL1xuICBhYnN0cmFjdCBnZXRGaWVsZHMoKTogUHJvbWlzZTxGaWVsZFtdPjtcblxuICAvKipcbiAgICog5qCh6aqM5YWs5byP5qC85byPXG4gICAqIEBwYXJhbSBmb3JtdWxhIOWFrOW8j+Wtl+espuS4slxuICAgKiBAcmV0dXJucyDmoKHpqoznu5PmnpxcbiAgICovXG4gIGFic3RyYWN0IHZhbGlkYXRlRm9ybXVsYShmb3JtdWxhOiBOelNhZmVBbnkpOiBQcm9taXNlPFZhbGlkYXRpb25SZXN1bHQ+O1xuXG4gIC8qKlxuICAgKiDojrflj5blrZfmrrXnmoTmj4/ov7BcbiAgICogQHBhcmFtIGl0ZW0g5a2X5q615a+56LGhXG4gICAqIEByZXR1cm5zIOaPj+i/sOWtl+espuS4slxuICAgKi9cbiAgZ2V0RmllbGREZXNjcmlwdGlvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoJycpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,299 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, effect, inject, input, signal, ViewChild } from '@angular/core';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { Editor } from '@tiptap/core';
5
+ import StarterKit from '@tiptap/starter-kit';
6
+ import { NzButtonModule } from 'ng-zorro-antd/button';
7
+ import { NzHighlightPipe } from 'ng-zorro-antd/core/highlight';
8
+ import { NzColDirective, NzGridModule } from 'ng-zorro-antd/grid';
9
+ import { NzIconModule } from 'ng-zorro-antd/icon';
10
+ import { NzInputModule } from 'ng-zorro-antd/input';
11
+ import { NzMessageService } from 'ng-zorro-antd/message';
12
+ import { NzToolTipModule } from 'ng-zorro-antd/tooltip';
13
+ import { NzTreeModule } from 'ng-zorro-antd/tree';
14
+ import { FormulaEditorRequestServiceToken } from './formula-editor-request.service';
15
+ import { CheckFormatMethod, FuncListType, ItemType, OPERATOR_LIST } from './formula-editor.model';
16
+ import { FormulaEditorService } from './formula-editor.service';
17
+ import { ICONS } from './formula-editor-icon';
18
+ import { DomSanitizer } from '@angular/platform-browser';
19
+ import * as i0 from "@angular/core";
20
+ import * as i1 from "ng-zorro-antd/grid";
21
+ import * as i2 from "ng-zorro-antd/input";
22
+ import * as i3 from "@angular/forms";
23
+ import * as i4 from "ng-zorro-antd/icon";
24
+ import * as i5 from "@angular/common";
25
+ import * as i6 from "ng-zorro-antd/tree";
26
+ import * as i7 from "ng-zorro-antd/button";
27
+ import * as i8 from "ng-zorro-antd/core/transition-patch";
28
+ import * as i9 from "ng-zorro-antd/tooltip";
29
+ /**
30
+ * 公式编辑器组件
31
+ * 用于创建和编辑计算公式,支持函数、指标和字段的插入与验证
32
+ * 依赖className与在使用组件处使用穿透样式实现样式
33
+ */
34
+ export class FormulaEditorComponent {
35
+ getOperatorIcon(type) {
36
+ const iconMap = {
37
+ add: ICONS.jia,
38
+ minus: ICONS.jian,
39
+ multiply: ICONS.cheng,
40
+ divide: ICONS.chu,
41
+ 'left-parenthesis': ICONS.zuokuohao,
42
+ 'right-parenthesis': ICONS.youkuohao
43
+ };
44
+ return this.sanitizer.bypassSecurityTrustHtml(iconMap[type] || '');
45
+ }
46
+ /**
47
+ * 构造函数
48
+ * 初始化信号监听,处理搜索和项目类型变化
49
+ */
50
+ constructor() {
51
+ this.formulaEditorService = inject(FormulaEditorService);
52
+ this.sanitizer = inject(DomSanitizer);
53
+ this.msg = inject(NzMessageService);
54
+ this.formulaEditorRequestService = inject(FormulaEditorRequestServiceToken);
55
+ /**
56
+ * 项目类型,决定显示字段或自定义
57
+ * 默认值:ItemType.Field
58
+ */
59
+ this.itemType = input(ItemType.Field);
60
+ /**
61
+ * 字段标题,当项目类型为字段时显示
62
+ * 默认值:'字段'
63
+ */
64
+ this.fieldTitle = input('字段');
65
+ /**
66
+ * 格式检查方法
67
+ * 默认值:CheckFormatMethod.self
68
+ */
69
+ this.checkFormatMethod = input(CheckFormatMethod.self);
70
+ /**
71
+ * 函数列表显示类型
72
+ * 默认值:FuncListType.Tree
73
+ */
74
+ this.functionListType = input(FuncListType.Tree);
75
+ this.itemTemplate = input(null);
76
+ this._itemType = ItemType;
77
+ this._funcListType = FuncListType;
78
+ this.searchWord = '';
79
+ this.fieldListOrigin = [];
80
+ this.fieldList = [];
81
+ this.checkLoading = false;
82
+ this.showDescription = true;
83
+ this.funcNode = [];
84
+ this.fieldDescription = '';
85
+ this.editDescription = '请选择函数';
86
+ this.editDescShow = 'none';
87
+ this.searchField = signal('');
88
+ this.searchFunction = signal('');
89
+ this._operatorList = OPERATOR_LIST;
90
+ effect(() => {
91
+ const searchWord = this.searchField();
92
+ this.fieldList = this.fieldListOrigin.filter(item => item.name.includes(searchWord));
93
+ });
94
+ effect(() => {
95
+ const itemType = this.itemType();
96
+ if (itemType === ItemType.Field) {
97
+ this.formulaEditorRequestService.getFields().then(res => {
98
+ this.fieldListOrigin = res;
99
+ this.fieldList = [...this.fieldListOrigin];
100
+ });
101
+ }
102
+ });
103
+ }
104
+ ngOnInit() {
105
+ this.formulaEditorRequestService.getFunctions().then(res => {
106
+ this.funcNode = res;
107
+ });
108
+ this.formulaEditorRequestService.getFieldDescription().then(res => {
109
+ this.fieldDescription = res;
110
+ });
111
+ }
112
+ ngAfterViewInit() {
113
+ this.formulaEditorService.initNodes();
114
+ this.editorObj = new Editor({
115
+ element: this.editor.nativeElement,
116
+ extensions: [
117
+ StarterKit.configure({
118
+ blockquote: false,
119
+ codeBlock: false,
120
+ code: false
121
+ }),
122
+ this.formulaEditorService.funcNode,
123
+ this.formulaEditorService.fieldNode
124
+ ]
125
+ });
126
+ }
127
+ insertFunc(func) {
128
+ this.editorObj
129
+ .chain()
130
+ .insertContent({
131
+ type: 'func',
132
+ attrs: {
133
+ name: func.name,
134
+ id: func.id,
135
+ className: `text-func-${func.className}`
136
+ },
137
+ content: []
138
+ })
139
+ .focus()
140
+ .run();
141
+ }
142
+ insertField(field) {
143
+ this.editorObj
144
+ .chain()
145
+ .insertContent({
146
+ type: 'field',
147
+ attrs: {
148
+ name: field.name,
149
+ id: field.id,
150
+ className: `text-field-${field.className}`
151
+ }
152
+ })
153
+ .focus()
154
+ .run();
155
+ }
156
+ insertOperator(operator) {
157
+ this.editorObj
158
+ .chain()
159
+ .insertContent({
160
+ type: 'text',
161
+ text: operator
162
+ })
163
+ .focus()
164
+ .run();
165
+ }
166
+ functionClick(node) {
167
+ const func = node.node.origin;
168
+ this.editDescription = func.description || '';
169
+ this.editDescShow = 'func';
170
+ this.insertFunc(func);
171
+ }
172
+ /**
173
+ * 获取公式JSON
174
+ * @returns 公式的JSON表示
175
+ * @example
176
+ * // 返回示例
177
+ * {
178
+ * "type": "doc",
179
+ * "content": [
180
+ * {
181
+ * "type": "paragraph",
182
+ * "content": [
183
+ * {
184
+ * "type": "func",
185
+ * "attrs": {
186
+ * "name": "SUM",
187
+ * "id": "sum",
188
+ * "className": "text-func-agg"
189
+ * }
190
+ * }
191
+ * ]
192
+ * }
193
+ * ]
194
+ * }
195
+ */
196
+ getFormula() {
197
+ const formula = this.editorObj.getJSON();
198
+ return formula;
199
+ }
200
+ /**
201
+ * 获取公式文本
202
+ * @returns 公式的纯文本表示
203
+ * @example
204
+ * // 返回示例
205
+ * "SUM(field1, field2)"
206
+ */
207
+ getFormulaText() {
208
+ const formulaText = this.editorObj.getText();
209
+ return formulaText;
210
+ }
211
+ checkFormat() {
212
+ if (this.checkFormatMethod() === CheckFormatMethod.self) {
213
+ const result = this.validateFormula();
214
+ if (result.isValid) {
215
+ this.msg.success('格式校验通过');
216
+ }
217
+ else {
218
+ this.msg.error(`格式校验不通过: ${result.errors.join(', ')}`);
219
+ this.editDescription = result.errors.join(', ');
220
+ this.editDescShow = 'error';
221
+ }
222
+ }
223
+ else {
224
+ this.checkLoading = true;
225
+ this.formulaEditorRequestService.validateFormula(this.getFormula()).then(res => {
226
+ this.checkLoading = false;
227
+ if (res.isValid) {
228
+ this.msg.success('格式校验通过');
229
+ }
230
+ else {
231
+ this.msg.error(`格式校验不通过: ${res.errors.join(', ')}`);
232
+ this.editDescription = res.errors.join(', ');
233
+ this.editDescShow = 'error';
234
+ }
235
+ });
236
+ }
237
+ }
238
+ /**
239
+ * 从JSON加载公式
240
+ * @param formula 公式的JSON表示
241
+ * @example
242
+ * // 使用示例
243
+ * const formula = {
244
+ * "type": "doc",
245
+ * "content": [
246
+ * {
247
+ * "type": "paragraph",
248
+ * "content": [
249
+ * {
250
+ * "type": "func",
251
+ * "attrs": {
252
+ * "name": "SUM",
253
+ * "id": "sum",
254
+ * "className": "text-func-agg"
255
+ * }
256
+ * }
257
+ * ]
258
+ * }
259
+ * ]
260
+ * };
261
+ * formulaEditor.loadFormula(formula);
262
+ */
263
+ loadFormula(formula) {
264
+ if (!formula || !this.editorObj) {
265
+ return;
266
+ }
267
+ this.editorObj.commands.setContent(formula);
268
+ }
269
+ // 校验公式
270
+ validateFormula() {
271
+ const formula = this.editorObj.getJSON();
272
+ const result = this.formulaEditorService.validateFormula(formula);
273
+ return result;
274
+ }
275
+ toggleDescription() {
276
+ this.showDescription = !this.showDescription;
277
+ }
278
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormulaEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
279
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FormulaEditorComponent, isStandalone: true, selector: "app-formula-editor", inputs: { itemType: { classPropertyName: "itemType", publicName: "itemType", isSignal: true, isRequired: false, transformFunction: null }, fieldTitle: { classPropertyName: "fieldTitle", publicName: "fieldTitle", isSignal: true, isRequired: false, transformFunction: null }, checkFormatMethod: { classPropertyName: "checkFormatMethod", publicName: "checkFormatMethod", isSignal: true, isRequired: false, transformFunction: null }, functionListType: { classPropertyName: "functionListType", publicName: "functionListType", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true }], ngImport: i0, template: "<div nz-row class=\"formula-editor\">\n <div nz-col nzSpan=\"10\" class=\"editor-box\">\n <div class=\"editor-title\">\n <div class=\"label-title label-require\">\u5B57\u6BB5\u8868\u8FBE\u5F0F</div>\n <button nz-button nzType=\"link\" nzSize=\"small\" [nzLoading]=\"checkLoading\" (click)=\"checkFormat()\">\u683C\u5F0F\u6821\u9A8C</button>\n </div>\n <div class=\"edit-box\">\n <div class=\"edit-operation-box\">\n @for (item of _operatorList; track item) {\n <div class=\"edit-operation-item\" (click)=\"insertOperator(item.name)\">\n <span class=\"operator-icon\" [innerHTML]=\"getOperatorIcon(item.type)\"></span>\n </div>\n }\n </div>\n <div #editor class=\"editor\"></div>\n @if (editDescShow !== 'none') {\n <div class=\"edit-description-box\">\n <div class=\"edit-description-head\" [style]=\"{ marginBottom: !showDescription ? '10px' : '0' }\">\n <span class=\"edit-description-title\">{{ editDescShow === 'func' ? '\u51FD\u6570\u91CA\u4E49' : '\u6821\u9A8C\u9519\u8BEF\u4FE1\u606F' }}</span>\n <span\n class=\"edit-description-icon\"\n nz-icon\n [nzType]=\"showDescription ? 'down' : 'up'\"\n nzTheme=\"outline\"\n (click)=\"toggleDescription()\"\n ></span>\n </div>\n @if (showDescription) {\n <div class=\"edit-description-text\"> {{ editDescription }} </div>\n }\n </div>\n }\n </div>\n </div>\n @switch (itemType()) {\n @case (_itemType.Field) {\n <div nz-col nzSpan=\"7\" class=\"field-box\">\n <div class=\"label-title\"\n >{{ fieldTitle() }}\n @if (fieldDescription) {\n <span nz-icon nzType=\"question-circle\" nzTheme=\"outline\" nz-tooltip [nzTooltipTitle]=\"fieldDescription\"></span>\n }\n </div>\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input placeholder=\"\u641C\u7D22\" [(ngModel)]=\"searchField\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\"></i>\n </ng-template>\n <div class=\"field-list\">\n @for (item of fieldList; track item) {\n <div (click)=\"insertField(item)\" [class]=\"item.className ? 'item-field-' + item.className : ''\" class=\"field-list-item\">\n @if (item.image) {\n <img class=\"field-img\" [src]=\"item.image\" />\n }\n @if (item.icon) {\n <span class=\"field-icon\" nz-icon [nzIconfont]=\"item.icon\"></span>\n }\n <span class=\"field-name\" [innerHTML]=\"item.name | nzHighlight: searchField() : 'i' : 'node-highlight'\"></span>\n @if (item.description) {\n <span\n class=\"desc-icon\"\n nz-icon\n nzType=\"question-circle\"\n nzTheme=\"outline\"\n nz-tooltip\n [nzTooltipTitle]=\"item.description\"\n ></span>\n }\n </div>\n }\n </div>\n </div>\n }\n @case (_itemType.Template) {\n <div nz-col nzSpan=\"7\" class=\"field-box\">\n <ng-container *ngTemplateOutlet=\"itemTemplate()\"></ng-container>\n </div>\n }\n }\n <div nz-col nzSpan=\"7\" class=\"function-box\">\n <div class=\"label-title\">\u51FD\u6570</div>\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input placeholder=\"\u641C\u7D22\" [(ngModel)]=\"searchFunction\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\"></i>\n </ng-template>\n <nz-tree\n class=\"function-tree\"\n [nzHideUnMatched]=\"true\"\n [nzSearchValue]=\"searchFunction()\"\n [nzTreeTemplate]=\"nzTreeTemplate\"\n [nzData]=\"funcNode\"\n [nzShowExpand]=\"functionListType() === _funcListType.Tree\"\n (nzClick)=\"functionClick($event)\"\n ></nz-tree>\n <ng-template #nzTreeTemplate let-node let-origin=\"origin\">\n <span class=\"custom-node\" [innerHTML]=\"origin.name | nzHighlight: searchFunction() : 'i' : 'node-highlight'\">\n @if (origin.description) {\n <span\n class=\"desc-icon\"\n nz-icon\n nzType=\"question-circle\"\n nzTheme=\"outline\"\n nz-tooltip\n [nzTooltipTitle]=\"origin.description\"\n ></span>\n }\n </span>\n </ng-template>\n </div>\n</div>\n", styles: [":host ::ng-deep .ant-tree-node-content-wrapper{width:100%}:host ::ng-deep .ant-input-affix-wrapper{padding:0 11px;height:32px}:host ::ng-deep .ProseMirror-focused{outline:none}:host ::ng-deep .node-highlight{color:#ff4d4f!important}:host .total-box{width:1000px;padding:8px;background-color:#fff}:host .ant-input-affix-wrapper{width:100%}:host .desc-icon{margin-left:auto}:host .formula-editor .editor-box{padding:12px;border-right:1px solid #e8e8e8}:host .formula-editor .editor-box .editor-title{display:flex;justify-content:space-between}:host .formula-editor .editor-box .edit-box{display:flex;flex-direction:column;height:400px;border:1px solid #ccc;border-radius:2px}:host .formula-editor .editor-box .edit-box .edit-operation-box{display:flex;gap:10px;align-items:center;height:32px;padding:0 10px;border-bottom:1px solid #ccc}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item{width:16px;height:16px;color:#687488;font-size:16px;line-height:16px;cursor:pointer;-webkit-user-select:none;user-select:none}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item .operator-icon{pointer-events:none}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item:hover .operator-icon{fill:#2e87ff}:host .formula-editor .editor-box .edit-box .edit-description-box{display:flex;flex-direction:column;padding:10px 10px 0;border-top:1px solid #ccc}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-head{display:flex;justify-content:space-between}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-text{max-height:128px;overflow:hidden auto;color:#333;font-size:13px;white-space:pre-wrap}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-title{color:#333;font-weight:700;font-size:14px}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-icon{font-size:14px;cursor:pointer}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-icon:hover{color:#2e87ff}:host .formula-editor .editor-box .edit-box .editor{flex:1;min-height:0;padding:12px 10px;overflow:auto;font-size:13px}:host .formula-editor .metric-box{padding:12px}:host .formula-editor .metric-box .metric-list{display:flex;flex-direction:column;gap:4px;height:360px;margin-top:12px;overflow-y:auto}:host .formula-editor .metric-box .metric-list-item{display:flex;align-items:center;height:32px;min-height:32px;padding:0 12px;border:1px solid #ccc;border-radius:2px;cursor:pointer}:host .formula-editor .metric-box .metric-list-item:hover{background:#2e87ff1a;border:1px solid #2e87ff;border-radius:2px}:host .formula-editor .metric-box .metric-list-item .metric-img{width:24px;height:24px;margin-right:8px}:host .formula-editor .metric-box .metric-list-item .metric-icon{margin-right:4px;font-size:16px}:host .formula-editor .metric-box .metric-list-item .metric-name{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host .formula-editor .field-box{padding:12px}:host .formula-editor .field-box .field-list{display:flex;flex-direction:column;gap:4px;height:360px;margin-top:12px;overflow-y:auto}:host .formula-editor .field-box .field-list-item{display:flex;flex-direction:row;align-items:center;height:32px;min-height:32px;padding:0 10px;border:1px solid #ccc;border-radius:2px;cursor:pointer}:host .formula-editor .field-box .field-list-item:hover{background:#2e87ff1a;border:1px solid #2e87ff;border-radius:2px}:host .formula-editor .field-box .field-list-item .field-img{width:24px;height:24px;margin-right:4px}:host .formula-editor .field-box .field-list-item .field-icon{margin-right:4px;font-size:16px}:host .formula-editor .field-box .field-list-item .field-name{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host .formula-editor .function-box{padding:12px;border-left:1px solid #e8e8e8}:host .formula-editor .function-box .function-tree{height:360px;margin-top:8px;overflow-y:auto}:host .formula-editor .function-box .function-tree .custom-node{display:flex;align-items:center}:host .formula-editor .label-title{margin-bottom:12px;color:#333;font-weight:400;font-size:14px}:host .formula-editor .label-require:after{margin-left:4px;color:#f5222d;content:\"*\"}\n"], dependencies: [{ kind: "directive", type: NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i2.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i2.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i2.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i4.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: NzTreeModule }, { kind: "component", type: i6.NzTreeComponent, selector: "nz-tree", inputs: ["nzShowIcon", "nzHideUnMatched", "nzBlockNode", "nzExpandAll", "nzSelectMode", "nzCheckStrictly", "nzShowExpand", "nzShowLine", "nzCheckable", "nzAsyncData", "nzDraggable", "nzMultiple", "nzExpandedIcon", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzTreeTemplate", "nzBeforeDrop", "nzData", "nzExpandedKeys", "nzSelectedKeys", "nzCheckedKeys", "nzSearchValue", "nzSearchFunc"], outputs: ["nzExpandedKeysChange", "nzSelectedKeysChange", "nzCheckedKeysChange", "nzSearchValueChange", "nzClick", "nzDblClick", "nzContextMenu", "nzCheckBoxChange", "nzExpandChange", "nzOnDragStart", "nzOnDragEnter", "nzOnDragOver", "nzOnDragLeave", "nzOnDrop", "nzOnDragEnd"], exportAs: ["nzTree"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i7.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i8.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i9.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "pipe", type: NzHighlightPipe, name: "nzHighlight" }] }); }
280
+ }
281
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormulaEditorComponent, decorators: [{
282
+ type: Component,
283
+ args: [{ selector: 'app-formula-editor', standalone: true, imports: [
284
+ NzColDirective,
285
+ NzGridModule,
286
+ NzInputModule,
287
+ FormsModule,
288
+ NzIconModule,
289
+ CommonModule,
290
+ NzTreeModule,
291
+ NzButtonModule,
292
+ NzToolTipModule,
293
+ NzHighlightPipe
294
+ ], template: "<div nz-row class=\"formula-editor\">\n <div nz-col nzSpan=\"10\" class=\"editor-box\">\n <div class=\"editor-title\">\n <div class=\"label-title label-require\">\u5B57\u6BB5\u8868\u8FBE\u5F0F</div>\n <button nz-button nzType=\"link\" nzSize=\"small\" [nzLoading]=\"checkLoading\" (click)=\"checkFormat()\">\u683C\u5F0F\u6821\u9A8C</button>\n </div>\n <div class=\"edit-box\">\n <div class=\"edit-operation-box\">\n @for (item of _operatorList; track item) {\n <div class=\"edit-operation-item\" (click)=\"insertOperator(item.name)\">\n <span class=\"operator-icon\" [innerHTML]=\"getOperatorIcon(item.type)\"></span>\n </div>\n }\n </div>\n <div #editor class=\"editor\"></div>\n @if (editDescShow !== 'none') {\n <div class=\"edit-description-box\">\n <div class=\"edit-description-head\" [style]=\"{ marginBottom: !showDescription ? '10px' : '0' }\">\n <span class=\"edit-description-title\">{{ editDescShow === 'func' ? '\u51FD\u6570\u91CA\u4E49' : '\u6821\u9A8C\u9519\u8BEF\u4FE1\u606F' }}</span>\n <span\n class=\"edit-description-icon\"\n nz-icon\n [nzType]=\"showDescription ? 'down' : 'up'\"\n nzTheme=\"outline\"\n (click)=\"toggleDescription()\"\n ></span>\n </div>\n @if (showDescription) {\n <div class=\"edit-description-text\"> {{ editDescription }} </div>\n }\n </div>\n }\n </div>\n </div>\n @switch (itemType()) {\n @case (_itemType.Field) {\n <div nz-col nzSpan=\"7\" class=\"field-box\">\n <div class=\"label-title\"\n >{{ fieldTitle() }}\n @if (fieldDescription) {\n <span nz-icon nzType=\"question-circle\" nzTheme=\"outline\" nz-tooltip [nzTooltipTitle]=\"fieldDescription\"></span>\n }\n </div>\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input placeholder=\"\u641C\u7D22\" [(ngModel)]=\"searchField\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\"></i>\n </ng-template>\n <div class=\"field-list\">\n @for (item of fieldList; track item) {\n <div (click)=\"insertField(item)\" [class]=\"item.className ? 'item-field-' + item.className : ''\" class=\"field-list-item\">\n @if (item.image) {\n <img class=\"field-img\" [src]=\"item.image\" />\n }\n @if (item.icon) {\n <span class=\"field-icon\" nz-icon [nzIconfont]=\"item.icon\"></span>\n }\n <span class=\"field-name\" [innerHTML]=\"item.name | nzHighlight: searchField() : 'i' : 'node-highlight'\"></span>\n @if (item.description) {\n <span\n class=\"desc-icon\"\n nz-icon\n nzType=\"question-circle\"\n nzTheme=\"outline\"\n nz-tooltip\n [nzTooltipTitle]=\"item.description\"\n ></span>\n }\n </div>\n }\n </div>\n </div>\n }\n @case (_itemType.Template) {\n <div nz-col nzSpan=\"7\" class=\"field-box\">\n <ng-container *ngTemplateOutlet=\"itemTemplate()\"></ng-container>\n </div>\n }\n }\n <div nz-col nzSpan=\"7\" class=\"function-box\">\n <div class=\"label-title\">\u51FD\u6570</div>\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input placeholder=\"\u641C\u7D22\" [(ngModel)]=\"searchFunction\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\"></i>\n </ng-template>\n <nz-tree\n class=\"function-tree\"\n [nzHideUnMatched]=\"true\"\n [nzSearchValue]=\"searchFunction()\"\n [nzTreeTemplate]=\"nzTreeTemplate\"\n [nzData]=\"funcNode\"\n [nzShowExpand]=\"functionListType() === _funcListType.Tree\"\n (nzClick)=\"functionClick($event)\"\n ></nz-tree>\n <ng-template #nzTreeTemplate let-node let-origin=\"origin\">\n <span class=\"custom-node\" [innerHTML]=\"origin.name | nzHighlight: searchFunction() : 'i' : 'node-highlight'\">\n @if (origin.description) {\n <span\n class=\"desc-icon\"\n nz-icon\n nzType=\"question-circle\"\n nzTheme=\"outline\"\n nz-tooltip\n [nzTooltipTitle]=\"origin.description\"\n ></span>\n }\n </span>\n </ng-template>\n </div>\n</div>\n", styles: [":host ::ng-deep .ant-tree-node-content-wrapper{width:100%}:host ::ng-deep .ant-input-affix-wrapper{padding:0 11px;height:32px}:host ::ng-deep .ProseMirror-focused{outline:none}:host ::ng-deep .node-highlight{color:#ff4d4f!important}:host .total-box{width:1000px;padding:8px;background-color:#fff}:host .ant-input-affix-wrapper{width:100%}:host .desc-icon{margin-left:auto}:host .formula-editor .editor-box{padding:12px;border-right:1px solid #e8e8e8}:host .formula-editor .editor-box .editor-title{display:flex;justify-content:space-between}:host .formula-editor .editor-box .edit-box{display:flex;flex-direction:column;height:400px;border:1px solid #ccc;border-radius:2px}:host .formula-editor .editor-box .edit-box .edit-operation-box{display:flex;gap:10px;align-items:center;height:32px;padding:0 10px;border-bottom:1px solid #ccc}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item{width:16px;height:16px;color:#687488;font-size:16px;line-height:16px;cursor:pointer;-webkit-user-select:none;user-select:none}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item .operator-icon{pointer-events:none}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item:hover .operator-icon{fill:#2e87ff}:host .formula-editor .editor-box .edit-box .edit-description-box{display:flex;flex-direction:column;padding:10px 10px 0;border-top:1px solid #ccc}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-head{display:flex;justify-content:space-between}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-text{max-height:128px;overflow:hidden auto;color:#333;font-size:13px;white-space:pre-wrap}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-title{color:#333;font-weight:700;font-size:14px}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-icon{font-size:14px;cursor:pointer}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-icon:hover{color:#2e87ff}:host .formula-editor .editor-box .edit-box .editor{flex:1;min-height:0;padding:12px 10px;overflow:auto;font-size:13px}:host .formula-editor .metric-box{padding:12px}:host .formula-editor .metric-box .metric-list{display:flex;flex-direction:column;gap:4px;height:360px;margin-top:12px;overflow-y:auto}:host .formula-editor .metric-box .metric-list-item{display:flex;align-items:center;height:32px;min-height:32px;padding:0 12px;border:1px solid #ccc;border-radius:2px;cursor:pointer}:host .formula-editor .metric-box .metric-list-item:hover{background:#2e87ff1a;border:1px solid #2e87ff;border-radius:2px}:host .formula-editor .metric-box .metric-list-item .metric-img{width:24px;height:24px;margin-right:8px}:host .formula-editor .metric-box .metric-list-item .metric-icon{margin-right:4px;font-size:16px}:host .formula-editor .metric-box .metric-list-item .metric-name{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host .formula-editor .field-box{padding:12px}:host .formula-editor .field-box .field-list{display:flex;flex-direction:column;gap:4px;height:360px;margin-top:12px;overflow-y:auto}:host .formula-editor .field-box .field-list-item{display:flex;flex-direction:row;align-items:center;height:32px;min-height:32px;padding:0 10px;border:1px solid #ccc;border-radius:2px;cursor:pointer}:host .formula-editor .field-box .field-list-item:hover{background:#2e87ff1a;border:1px solid #2e87ff;border-radius:2px}:host .formula-editor .field-box .field-list-item .field-img{width:24px;height:24px;margin-right:4px}:host .formula-editor .field-box .field-list-item .field-icon{margin-right:4px;font-size:16px}:host .formula-editor .field-box .field-list-item .field-name{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host .formula-editor .function-box{padding:12px;border-left:1px solid #e8e8e8}:host .formula-editor .function-box .function-tree{height:360px;margin-top:8px;overflow-y:auto}:host .formula-editor .function-box .function-tree .custom-node{display:flex;align-items:center}:host .formula-editor .label-title{margin-bottom:12px;color:#333;font-weight:400;font-size:14px}:host .formula-editor .label-require:after{margin-left:4px;color:#f5222d;content:\"*\"}\n"] }]
295
+ }], ctorParameters: () => [], propDecorators: { editor: [{
296
+ type: ViewChild,
297
+ args: ['editor']
298
+ }] } });
299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29tcG9uZW50cy9mb3JtdWxhLWVkaXRvci9mb3JtdWxhLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL2Zvcm11bGEtZWRpdG9yL2Zvcm11bGEtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQXNDLE1BQU0sZUFBZSxDQUFDO0FBQzVJLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQXFCLFlBQVksRUFBcUIsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RixPQUFPLEVBQStCLGdDQUFnQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakgs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QUNYLFlBQVksaU5BQ1osWUFBWSxxTUFDWixZQUFZLGswQkFDWixjQUFjLG9mQUNkLGVBQWUsb2ZBQ2YsZUFBZTs7NEZBS04sc0JBQXNCO2tCQWxCbEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FDbEIsSUFBSSxXQUNQO3dCQUNQLGNBQWM7d0JBQ2QsWUFBWTt3QkFDWixhQUFhO3dCQUNiLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixZQUFZO3dCQUNaLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxlQUFlO3dCQUNmLGVBQWU7cUJBQ2hCO3dEQVNvQixNQUFNO3NCQUExQixTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIHNpZ25hbCwgU2lnbmFsLCBWaWV3Q2hpbGQsIEFmdGVyVmlld0luaXQsIE9uSW5pdCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnQHRpcHRhcC9jb3JlJztcbmltcG9ydCBTdGFydGVyS2l0IGZyb20gJ0B0aXB0YXAvc3RhcnRlci1raXQnO1xuaW1wb3J0IHsgTnpCdXR0b25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2J1dHRvbic7XG5pbXBvcnQgeyBOekhpZ2hsaWdodFBpcGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvaGlnaGxpZ2h0JztcbmltcG9ydCB7IE56Q29sRGlyZWN0aXZlLCBOekdyaWRNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2dyaWQnO1xuaW1wb3J0IHsgTnpJY29uTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pY29uJztcbmltcG9ydCB7IE56SW5wdXRNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2lucHV0JztcbmltcG9ydCB7IE56TWVzc2FnZVNlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL21lc3NhZ2UnO1xuaW1wb3J0IHsgTnpUb29sVGlwTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC90b29sdGlwJztcbmltcG9ydCB7IE56Rm9ybWF0RW1pdEV2ZW50LCBOelRyZWVNb2R1bGUsIE56VHJlZU5vZGVPcHRpb25zIH0gZnJvbSAnbmctem9ycm8tYW50ZC90cmVlJztcblxuaW1wb3J0IHsgRm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlLCBGb3JtdWxhRWRpdG9yUmVxdWVzdFNlcnZpY2VUb2tlbiB9IGZyb20gJy4vZm9ybXVsYS1lZGl0b3ItcmVxdWVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IENoZWNrRm9ybWF0TWV0aG9kLCBGaWVsZCwgRnVuYywgRnVuY0xpc3RUeXBlLCBJdGVtVHlwZSwgT1BFUkFUT1JfTElTVCB9IGZyb20gJy4vZm9ybXVsYS1lZGl0b3IubW9kZWwnO1xuaW1wb3J0IHsgRm9ybXVsYUVkaXRvclNlcnZpY2UsIFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuL2Zvcm11bGEtZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUNPTlMgfSBmcm9tICcuL2Zvcm11bGEtZWRpdG9yLWljb24nO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbi8qKlxuICog5YWs5byP57yW6L6R5Zmo57uE5Lu2XG4gKiDnlKjkuo7liJvlu7rlkoznvJbovpHorqHnrpflhazlvI/vvIzmlK/mjIHlh73mlbDjgIHmjIfmoIflkozlrZfmrrXnmoTmj5LlhaXkuI7pqozor4FcbiAqIOS+nei1lmNsYXNzTmFtZeS4juWcqOS9v+eUqOe7hOS7tuWkhOS9v+eUqOepv+mAj+agt+W8j+WunueOsOagt+W8j1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZm9ybXVsYS1lZGl0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTnpDb2xEaXJlY3RpdmUsXG4gICAgTnpHcmlkTW9kdWxlLFxuICAgIE56SW5wdXRNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTnpJY29uTW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBOelRyZWVNb2R1bGUsXG4gICAgTnpCdXR0b25Nb2R1bGUsXG4gICAgTnpUb29sVGlwTW9kdWxlLFxuICAgIE56SGlnaGxpZ2h0UGlwZVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybXVsYS1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtdWxhLWVkaXRvci5jb21wb25lbnQubGVzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZvcm11bGFFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IGZvcm11bGFFZGl0b3JTZXJ2aWNlID0gaW5qZWN0KEZvcm11bGFFZGl0b3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzYW5pdGl6ZXIgPSBpbmplY3QoRG9tU2FuaXRpemVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBtc2cgPSBpbmplY3QoTnpNZXNzYWdlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0PEZvcm11bGFFZGl0b3JSZXF1ZXN0U2VydmljZT4oRm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlVG9rZW4pO1xuICBAVmlld0NoaWxkKCdlZGl0b3InKSBlZGl0b3IhOiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiDpobnnm67nsbvlnovvvIzlhrPlrprmmL7npLrlrZfmrrXmiJboh6rlrprkuYlcbiAgICog6buY6K6k5YC877yaSXRlbVR5cGUuRmllbGRcbiAgICovXG4gIGl0ZW1UeXBlID0gaW5wdXQ8SXRlbVR5cGU+KEl0ZW1UeXBlLkZpZWxkKTtcblxuICAvKipcbiAgICog5a2X5q615qCH6aKY77yM5b2T6aG555uu57G75Z6L5Li65a2X5q615pe25pi+56S6XG4gICAqIOm7mOiupOWAvO+8miflrZfmrrUnXG4gICAqL1xuICBmaWVsZFRpdGxlID0gaW5wdXQ8c3RyaW5nPign5a2X5q61Jyk7XG5cbiAgLyoqXG4gICAqIOagvOW8j+ajgOafpeaWueazlVxuICAgKiDpu5jorqTlgLzvvJpDaGVja0Zvcm1hdE1ldGhvZC5zZWxmXG4gICAqL1xuICBjaGVja0Zvcm1hdE1ldGhvZCA9IGlucHV0PENoZWNrRm9ybWF0TWV0aG9kPihDaGVja0Zvcm1hdE1ldGhvZC5zZWxmKTtcblxuICAvKipcbiAgICog5Ye95pWw5YiX6KGo5pi+56S657G75Z6LXG4gICAqIOm7mOiupOWAvO+8mkZ1bmNMaXN0VHlwZS5UcmVlXG4gICAqL1xuICBmdW5jdGlvbkxpc3RUeXBlID0gaW5wdXQ8RnVuY0xpc3RUeXBlPihGdW5jTGlzdFR5cGUuVHJlZSk7XG5cbiAgaXRlbVRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBfaXRlbVR5cGUgPSBJdGVtVHlwZTtcbiAgcmVhZG9ubHkgX2Z1bmNMaXN0VHlwZSA9IEZ1bmNMaXN0VHlwZTtcblxuICBzZWFyY2hXb3JkOiBzdHJpbmcgPSAnJztcblxuICBmaWVsZExpc3RPcmlnaW46IEZpZWxkW10gPSBbXTtcbiAgZmllbGRMaXN0OiBGaWVsZFtdID0gW107XG5cbiAgZWRpdG9yT2JqITogRWRpdG9yO1xuICBjaGVja0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd0Rlc2NyaXB0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICBmdW5jTm9kZTogTnpUcmVlTm9kZU9wdGlvbnNbXSA9IFtdO1xuICBmaWVsZERlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgZWRpdERlc2NyaXB0aW9uOiBzdHJpbmcgPSAn6K+36YCJ5oup5Ye95pWwJztcblxuICBlZGl0RGVzY1Nob3c6ICdmdW5jJyB8ICdlcnJvcicgfCAnbm9uZScgPSAnbm9uZSc7XG5cbiAgc2VhcmNoRmllbGQ6IFNpZ25hbDxzdHJpbmc+ID0gc2lnbmFsKCcnKTtcbiAgc2VhcmNoRnVuY3Rpb246IFNpZ25hbDxzdHJpbmc+ID0gc2lnbmFsKCcnKTtcblxuICBfb3BlcmF0b3JMaXN0ID0gT1BFUkFUT1JfTElTVDtcblxuICBnZXRPcGVyYXRvckljb24odHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpY29uTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgYWRkOiBJQ09OUy5qaWEsXG4gICAgICBtaW51czogSUNPTlMuamlhbixcbiAgICAgIG11bHRpcGx5OiBJQ09OUy5jaGVuZyxcbiAgICAgIGRpdmlkZTogSUNPTlMuY2h1LFxuICAgICAgJ2xlZnQtcGFyZW50aGVzaXMnOiBJQ09OUy56dW9rdW9oYW8sXG4gICAgICAncmlnaHQtcGFyZW50aGVzaXMnOiBJQ09OUy55b3VrdW9oYW9cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChpY29uTWFwW3R5cGVdIHx8ICcnKSBhcyBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICog5p6E6YCg5Ye95pWwXG4gICAqIOWIneWni+WMluS/oeWPt+ebkeWQrO+8jOWkhOeQhuaQnOe0ouWSjOmhueebruexu+Wei+WPmOWMllxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qgc2VhcmNoV29yZCA9IHRoaXMuc2VhcmNoRmllbGQoKTtcbiAgICAgIHRoaXMuZmllbGRMaXN0ID0gdGhpcy5maWVsZExpc3RPcmlnaW4uZmlsdGVyKGl0ZW0gPT4gaXRlbS5uYW1lLmluY2x1ZGVzKHNlYXJjaFdvcmQpKTtcbiAgICB9KTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgaXRlbVR5cGUgPSB0aGlzLml0ZW1UeXBlKCk7XG4gICAgICBpZiAoaXRlbVR5cGUgPT09IEl0ZW1UeXBlLkZpZWxkKSB7XG4gICAgICAgIHRoaXMuZm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlLmdldEZpZWxkcygpLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLmZpZWxkTGlzdE9yaWdpbiA9IHJlcztcbiAgICAgICAgICB0aGlzLmZpZWxkTGlzdCA9IFsuLi50aGlzLmZpZWxkTGlzdE9yaWdpbl07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mb3JtdWxhRWRpdG9yUmVxdWVzdFNlcnZpY2UuZ2V0RnVuY3Rpb25zKCkudGhlbihyZXMgPT4ge1xuICAgICAgdGhpcy5mdW5jTm9kZSA9IHJlcztcbiAgICB9KTtcbiAgICB0aGlzLmZvcm11bGFFZGl0b3JSZXF1ZXN0U2VydmljZS5nZXRGaWVsZERlc2NyaXB0aW9uKCkudGhlbihyZXMgPT4ge1xuICAgICAgdGhpcy5maWVsZERlc2NyaXB0aW9uID0gcmVzO1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuZm9ybXVsYUVkaXRvclNlcnZpY2UuaW5pdE5vZGVzKCk7XG4gICAgdGhpcy5lZGl0b3JPYmogPSBuZXcgRWRpdG9yKHtcbiAgICAgIGVsZW1lbnQ6IHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQsXG4gICAgICBleHRlbnNpb25zOiBbXG4gICAgICAgIFN0YXJ0ZXJLaXQuY29uZmlndXJlKHtcbiAgICAgICAgICBibG9ja3F1b3RlOiBmYWxzZSxcbiAgICAgICAgICBjb2RlQmxvY2s6IGZhbHNlLFxuICAgICAgICAgIGNvZGU6IGZhbHNlXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLmZvcm11bGFFZGl0b3JTZXJ2aWNlLmZ1bmNOb2RlISxcbiAgICAgICAgdGhpcy5mb3JtdWxhRWRpdG9yU2VydmljZS5maWVsZE5vZGUhXG4gICAgICBdXG4gICAgfSk7XG4gIH1cblxuICBpbnNlcnRGdW5jKGZ1bmM6IEZ1bmMpIHtcbiAgICB0aGlzLmVkaXRvck9ialxuICAgICAgLmNoYWluKClcbiAgICAgIC5pbnNlcnRDb250ZW50KHtcbiAgICAgICAgdHlwZTogJ2Z1bmMnLFxuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIG5hbWU6IGZ1bmMubmFtZSxcbiAgICAgICAgICBpZDogZnVuYy5pZCxcbiAgICAgICAgICBjbGFzc05hbWU6IGB0ZXh0LWZ1bmMtJHtmdW5jLmNsYXNzTmFtZX1gXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnQ6IFtdXG4gICAgICB9KVxuICAgICAgLmZvY3VzKClcbiAgICAgIC5ydW4oKTtcbiAgfVxuXG4gIGluc2VydEZpZWxkKGZpZWxkOiBGaWVsZCkge1xuICAgIHRoaXMuZWRpdG9yT2JqXG4gICAgICAuY2hhaW4oKVxuICAgICAgLmluc2VydENvbnRlbnQoe1xuICAgICAgICB0eXBlOiAnZmllbGQnLFxuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIG5hbWU6IGZpZWxkLm5hbWUsXG4gICAgICAgICAgaWQ6IGZpZWxkLmlkLFxuICAgICAgICAgIGNsYXNzTmFtZTogYHRleHQtZmllbGQtJHtmaWVsZC5jbGFzc05hbWV9YFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZvY3VzKClcbiAgICAgIC5ydW4oKTtcbiAgfVxuXG4gIGluc2VydE9wZXJhdG9yKG9wZXJhdG9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvck9ialxuICAgICAgLmNoYWluKClcbiAgICAgIC5pbnNlcnRDb250ZW50KHtcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICB0ZXh0OiBvcGVyYXRvclxuICAgICAgfSlcbiAgICAgIC5mb2N1cygpXG4gICAgICAucnVuKCk7XG4gIH1cblxuICBmdW5jdGlvbkNsaWNrKG5vZGU6IE56Rm9ybWF0RW1pdEV2ZW50KSB7XG4gICAgY29uc3QgZnVuYyA9IG5vZGUubm9kZSEub3JpZ2luIGFzIHVua25vd24gYXMgRnVuYztcbiAgICB0aGlzLmVkaXREZXNjcmlwdGlvbiA9IGZ1bmMuZGVzY3JpcHRpb24gfHwgJyc7XG4gICAgdGhpcy5lZGl0RGVzY1Nob3cgPSAnZnVuYyc7XG4gICAgdGhpcy5pbnNlcnRGdW5jKGZ1bmMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluWFrOW8j0pTT05cbiAgICogQHJldHVybnMg5YWs5byP55qESlNPTuihqOekulxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyDov5Tlm57npLrkvotcbiAgICoge1xuICAgKiAgIFwidHlwZVwiOiBcImRvY1wiLFxuICAgKiAgIFwiY29udGVudFwiOiBbXG4gICAqICAgICB7XG4gICAqICAgICAgIFwidHlwZVwiOiBcInBhcmFncmFwaFwiLFxuICAgKiAgICAgICBcImNvbnRlbnRcIjogW1xuICAgKiAgICAgICAgIHtcbiAgICogICAgICAgICAgIFwidHlwZVwiOiBcImZ1bmNcIixcbiAgICogICAgICAgICAgIFwiYXR0cnNcIjoge1xuICAgKiAgICAgICAgICAgICBcIm5hbWVcIjogXCJTVU1cIixcbiAgICogICAgICAgICAgICAgXCJpZFwiOiBcInN1bVwiLFxuICAgKiAgICAgICAgICAgICBcImNsYXNzTmFtZVwiOiBcInRleHQtZnVuYy1hZ2dcIlxuICAgKiAgICAgICAgICAgfVxuICAgKiAgICAgICAgIH1cbiAgICogICAgICAgXVxuICAgKiAgICAgfVxuICAgKiAgIF1cbiAgICogfVxuICAgKi9cbiAgcHVibGljIGdldEZvcm11bGEoKSB7XG4gICAgY29uc3QgZm9ybXVsYSA9IHRoaXMuZWRpdG9yT2JqLmdldEpTT04oKTtcbiAgICByZXR1cm4gZm9ybXVsYTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blhazlvI/mlofmnKxcbiAgICogQHJldHVybnMg5YWs5byP55qE57qv5paH5pys6KGo56S6XG4gICAqIEBleGFtcGxlXG4gICAqIC8vIOi/lOWbnuekuuS+i1xuICAgKiBcIlNVTShmaWVsZDEsIGZpZWxkMilcIlxuICAgKi9cbiAgcHVibGljIGdldEZvcm11bGFUZXh0KCkge1xuICAgIGNvbnN0IGZvcm11bGFUZXh0ID0gdGhpcy5lZGl0b3JPYmouZ2V0VGV4dCgpO1xuICAgIHJldHVybiBmb3JtdWxhVGV4dDtcbiAgfVxuXG4gIGNoZWNrRm9ybWF0KCkge1xuICAgIGlmICh0aGlzLmNoZWNrRm9ybWF0TWV0aG9kKCkgPT09IENoZWNrRm9ybWF0TWV0aG9kLnNlbGYpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGVGb3JtdWxhKCk7XG4gICAgICBpZiAocmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhpcy5tc2cuc3VjY2Vzcygn5qC85byP5qCh6aqM6YCa6L+HJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1zZy5lcnJvcihg5qC85byP5qCh6aqM5LiN6YCa6L+HOiAke3Jlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gKTtcbiAgICAgICAgdGhpcy5lZGl0RGVzY3JpcHRpb24gPSByZXN1bHQuZXJyb3JzLmpvaW4oJywgJyk7XG4gICAgICAgIHRoaXMuZWRpdERlc2NTaG93ID0gJ2Vycm9yJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGVja0xvYWRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5mb3JtdWxhRWRpdG9yUmVxdWVzdFNlcnZpY2UudmFsaWRhdGVGb3JtdWxhKHRoaXMuZ2V0Rm9ybXVsYSgpKS50aGVuKHJlcyA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChyZXMuaXNWYWxpZCkge1xuICAgICAgICAgIHRoaXMubXNnLnN1Y2Nlc3MoJ+agvOW8j+agoemqjOmAmui/hycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubXNnLmVycm9yKGDmoLzlvI/moKHpqozkuI3pgJrov4c6ICR7cmVzLmVycm9ycy5qb2luKCcsICcpfWApO1xuICAgICAgICAgIHRoaXMuZWRpdERlc2NyaXB0aW9uID0gcmVzLmVycm9ycy5qb2luKCcsICcpO1xuICAgICAgICAgIHRoaXMuZWRpdERlc2NTaG93ID0gJ2Vycm9yJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOS7jkpTT07liqDovb3lhazlvI9cbiAgICogQHBhcmFtIGZvcm11bGEg5YWs5byP55qESlNPTuihqOekulxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyDkvb/nlKjnpLrkvotcbiAgICogY29uc3QgZm9ybXVsYSA9IHtcbiAgICogICBcInR5cGVcIjogXCJkb2NcIixcbiAgICogICBcImNvbnRlbnRcIjogW1xuICAgKiAgICAge1xuICAgKiAgICAgICBcInR5cGVcIjogXCJwYXJhZ3JhcGhcIixcbiAgICogICAgICAgXCJjb250ZW50XCI6IFtcbiAgICogICAgICAgICB7XG4gICAqICAgICAgICAgICBcInR5cGVcIjogXCJmdW5jXCIsXG4gICAqICAgICAgICAgICBcImF0dHJzXCI6IHtcbiAgICogICAgICAgICAgICAgXCJuYW1lXCI6IFwiU1VNXCIsXG4gICAqICAgICAgICAgICAgIFwiaWRcIjogXCJzdW1cIixcbiAgICogICAgICAgICAgICAgXCJjbGFzc05hbWVcIjogXCJ0ZXh0LWZ1bmMtYWdnXCJcbiAgICogICAgICAgICAgIH1cbiAgICogICAgICAgICB9XG4gICAqICAgICAgIF1cbiAgICogICAgIH1cbiAgICogICBdXG4gICAqIH07XG4gICAqIGZvcm11bGFFZGl0b3IubG9hZEZvcm11bGEoZm9ybXVsYSk7XG4gICAqL1xuICBwdWJsaWMgbG9hZEZvcm11bGEoZm9ybXVsYTogYW55KSB7XG4gICAgaWYgKCFmb3JtdWxhIHx8ICF0aGlzLmVkaXRvck9iaikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVkaXRvck9iai5jb21tYW5kcy5zZXRDb250ZW50KGZvcm11bGEpO1xuICB9XG5cbiAgLy8g5qCh6aqM5YWs5byPXG4gIHZhbGlkYXRlRm9ybXVsYSgpOiBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBmb3JtdWxhID0gdGhpcy5lZGl0b3JPYmouZ2V0SlNPTigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZm9ybXVsYUVkaXRvclNlcnZpY2UudmFsaWRhdGVGb3JtdWxhKGZvcm11bGEpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB0b2dnbGVEZXNjcmlwdGlvbigpIHtcbiAgICB0aGlzLnNob3dEZXNjcmlwdGlvbiA9ICF0aGlzLnNob3dEZXNjcmlwdGlvbjtcbiAgfVxufVxuIiwiPGRpdiBuei1yb3cgY2xhc3M9XCJmb3JtdWxhLWVkaXRvclwiPlxuICA8ZGl2IG56LWNvbCBuelNwYW49XCIxMFwiIGNsYXNzPVwiZWRpdG9yLWJveFwiPlxuICAgIDxkaXYgY2xhc3M9XCJlZGl0b3ItdGl0bGVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC10aXRsZSBsYWJlbC1yZXF1aXJlXCI+5a2X5q616KGo6L6+5byPPC9kaXY+XG4gICAgICA8YnV0dG9uIG56LWJ1dHRvbiBuelR5cGU9XCJsaW5rXCIgbnpTaXplPVwic21hbGxcIiBbbnpMb2FkaW5nXT1cImNoZWNrTG9hZGluZ1wiIChjbGljayk9XCJjaGVja0Zvcm1hdCgpXCI+5qC85byP5qCh6aqMPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImVkaXQtYm94XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1vcGVyYXRpb24tYm94XCI+XG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgX29wZXJhdG9yTGlzdDsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LW9wZXJhdGlvbi1pdGVtXCIgKGNsaWNrKT1cImluc2VydE9wZXJhdG9yKGl0ZW0ubmFtZSlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3BlcmF0b3ItaWNvblwiIFtpbm5lckhUTUxdPVwiZ2V0T3BlcmF0b3JJY29uKGl0ZW0udHlwZSlcIj48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAjZWRpdG9yIGNsYXNzPVwiZWRpdG9yXCI+PC9kaXY+XG4gICAgICBAaWYgKGVkaXREZXNjU2hvdyAhPT0gJ25vbmUnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LWRlc2NyaXB0aW9uLWJveFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LWRlc2NyaXB0aW9uLWhlYWRcIiBbc3R5bGVdPVwieyBtYXJnaW5Cb3R0b206ICFzaG93RGVzY3JpcHRpb24gPyAnMTBweCcgOiAnMCcgfVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlZGl0LWRlc2NyaXB0aW9uLXRpdGxlXCI+e3sgZWRpdERlc2NTaG93ID09PSAnZnVuYycgPyAn5Ye95pWw6YeK5LmJJyA6ICfmoKHpqozplJnor6/kv6Hmga8nIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0LWRlc2NyaXB0aW9uLWljb25cIlxuICAgICAgICAgICAgICBuei1pY29uXG4gICAgICAgICAgICAgIFtuelR5cGVdPVwic2hvd0Rlc2NyaXB0aW9uID8gJ2Rvd24nIDogJ3VwJ1wiXG4gICAgICAgICAgICAgIG56VGhlbWU9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURlc2NyaXB0aW9uKClcIlxuICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKHNob3dEZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtZGVzY3JpcHRpb24tdGV4dFwiPiB7eyBlZGl0RGVzY3JpcHRpb24gfX0gPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIEBzd2l0Y2ggKGl0ZW1UeXBlKCkpIHtcbiAgICBAY2FzZSAoX2l0ZW1UeXBlLkZpZWxkKSB7XG4gICAgICA8ZGl2IG56LWNvbCBuelNwYW49XCI3XCIgY2xhc3M9XCJmaWVsZC1ib3hcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLXRpdGxlXCJcbiAgICAgICAgICA+e3sgZmllbGRUaXRsZSgpIH19XG4gICAgICAgICAgQGlmIChmaWVsZERlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICA8c3BhbiBuei1pY29uIG56VHlwZT1cInF1ZXN0aW9uLWNpcmNsZVwiIG56VGhlbWU9XCJvdXRsaW5lXCIgbnotdG9vbHRpcCBbbnpUb29sdGlwVGl0bGVdPVwiZmllbGREZXNjcmlwdGlvblwiPjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bnotaW5wdXQtZ3JvdXAgW256U3VmZml4XT1cInN1ZmZpeEljb25TZWFyY2hcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuei1pbnB1dCBwbGFjZWhvbGRlcj1cIuaQnOe0olwiIFsobmdNb2RlbCldPVwic2VhcmNoRmllbGRcIiAvPlxuICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3N1ZmZpeEljb25TZWFyY2g+XG4gICAgICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJzZWFyY2hcIj48L2k+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1saXN0XCI+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiBmaWVsZExpc3Q7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImluc2VydEZpZWxkKGl0ZW0pXCIgW2NsYXNzXT1cIml0ZW0uY2xhc3NOYW1lID8gJ2l0ZW0tZmllbGQtJyArIGl0ZW0uY2xhc3NOYW1lIDogJydcIiBjbGFzcz1cImZpZWxkLWxpc3QtaXRlbVwiPlxuICAgICAgICAgICAgICBAaWYgKGl0ZW0uaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZmllbGQtaW1nXCIgW3NyY109XCJpdGVtLmltYWdlXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGl0ZW0uaWNvbikge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtaWNvblwiIG56LWljb24gW256SWNvbmZvbnRdPVwiaXRlbS5pY29uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbmFtZVwiIFtpbm5lckhUTUxdPVwiaXRlbS5uYW1lIHwgbnpIaWdobGlnaHQ6IHNlYXJjaEZpZWxkKCkgOiAnaScgOiAnbm9kZS1oaWdobGlnaHQnXCI+PC9zcGFuPlxuICAgICAgICAgICAgICBAaWYgKGl0ZW0uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXNjLWljb25cIlxuICAgICAgICAgICAgICAgICAgbnotaWNvblxuICAgICAgICAgICAgICAgICAgbnpUeXBlPVwicXVlc3Rpb24tY2lyY2xlXCJcbiAgICAgICAgICAgICAgICAgIG56VGhlbWU9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgIG56LXRvb2x0aXBcbiAgICAgICAgICAgICAgICAgIFtuelRvb2x0aXBUaXRsZV09XCJpdGVtLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIEBjYXNlIChfaXRlbVR5cGUuVGVtcGxhdGUpIHtcbiAgICAgIDxkaXYgbnotY29sIG56U3Bhbj1cIjdcIiBjbGFzcz1cImZpZWxkLWJveFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVRlbXBsYXRlKClcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuICA8ZGl2IG56LWNvbCBuelNwYW49XCI3XCIgY2xhc3M9XCJmdW5jdGlvbi1ib3hcIj5cbiAgICA8ZGl2IGNsYXNzPVwibGFiZWwtdGl0bGVcIj7lh73mlbA8L2Rpdj5cbiAgICA8bnotaW5wdXQtZ3JvdXAgW256U3VmZml4XT1cInN1ZmZpeEljb25TZWFyY2hcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG56LWlucHV0IHBsYWNlaG9sZGVyPVwi5pCc57SiXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hGdW5jdGlvblwiIC8+XG4gICAgPC9uei1pbnB1dC1ncm91cD5cbiAgICA8bmctdGVtcGxhdGUgI3N1ZmZpeEljb25TZWFyY2g+XG4gICAgICA8aSBuei1pY29uIG56VHlwZT1cInNlYXJjaFwiPjwvaT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuei10cmVlXG4gICAgICBjbGFzcz1cImZ1bmN0aW9uLXRyZWVcIlxuICAgICAgW256SGlkZVVuTWF0Y2hlZF09XCJ0cnVlXCJcbiAgICAgIFtuelNlYXJjaFZhbHVlXT1cInNlYXJjaEZ1bmN0aW9uKClcIlxuICAgICAgW256VHJlZVRlbXBsYXRlXT1cIm56VHJlZVRlbXBsYXRlXCJcbiAgICAgIFtuekRhdGFdPVwiZnVuY05vZGVcIlxuICAgICAgW256U2hvd0V4cGFuZF09XCJmdW5jdGlvbkxpc3RUeXBlKCkgPT09IF9mdW5jTGlzdFR5cGUuVHJlZVwiXG4gICAgICAobnpDbGljayk9XCJmdW5jdGlvbkNsaWNrKCRldmVudClcIlxuICAgID48L256LXRyZWU+XG4gICAgPG5nLXRlbXBsYXRlICNuelRyZWVUZW1wbGF0ZSBsZXQtbm9kZSBsZXQtb3JpZ2luPVwib3JpZ2luXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbS1ub2RlXCIgW2lubmVySFRNTF09XCJvcmlnaW4ubmFtZSB8IG56SGlnaGxpZ2h0OiBzZWFyY2hGdW5jdGlvbigpIDogJ2knIDogJ25vZGUtaGlnaGxpZ2h0J1wiPlxuICAgICAgICBAaWYgKG9yaWdpbi5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cImRlc2MtaWNvblwiXG4gICAgICAgICAgICBuei1pY29uXG4gICAgICAgICAgICBuelR5cGU9XCJxdWVzdGlvbi1jaXJjbGVcIlxuICAgICAgICAgICAgbnpUaGVtZT1cIm91dGxpbmVcIlxuICAgICAgICAgICAgbnotdG9vbHRpcFxuICAgICAgICAgICAgW256VG9vbHRpcFRpdGxlXT1cIm9yaWdpbi5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS1lZGl0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb21wb25lbnRzL2Zvcm11bGEtZWRpdG9yL2Zvcm11bGEtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
@@ -0,0 +1,57 @@
1
+ /**
2
+ * 输入项类型,可选择指标模式或字段模式
3
+ */
4
+ export var ItemType;
5
+ (function (ItemType) {
6
+ ItemType["Field"] = "field";
7
+ ItemType["Template"] = "template"; // 模板模式
8
+ })(ItemType || (ItemType = {}));
9
+ /**
10
+ * 输入校验格式方法
11
+ */
12
+ export var CheckFormatMethod;
13
+ (function (CheckFormatMethod) {
14
+ CheckFormatMethod["self"] = "self";
15
+ CheckFormatMethod["server"] = "server"; // 自定义异步校验
16
+ })(CheckFormatMethod || (CheckFormatMethod = {}));
17
+ /**
18
+ * 函数列表模式,可选择列表或树模式
19
+ */
20
+ export var FuncListType;
21
+ (function (FuncListType) {
22
+ FuncListType["List"] = "list";
23
+ FuncListType["Tree"] = "tree"; // 树模式
24
+ })(FuncListType || (FuncListType = {}));
25
+ export const OPERATOR_LIST = [
26
+ {
27
+ type: 'add',
28
+ name: '+',
29
+ description: '加法'
30
+ },
31
+ {
32
+ type: 'minus',
33
+ name: '-',
34
+ description: '减法'
35
+ },
36
+ {
37
+ type: 'multiply',
38
+ name: '*',
39
+ description: '乘法'
40
+ },
41
+ {
42
+ type: 'divide',
43
+ name: '/',
44
+ description: '除法'
45
+ },
46
+ {
47
+ type: 'left-parenthesis',
48
+ name: '(',
49
+ description: '左括号'
50
+ },
51
+ {
52
+ type: 'right-parenthesis',
53
+ name: ')',
54
+ description: '右括号'
55
+ }
56
+ ];
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS1lZGl0b3IubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb21wb25lbnRzL2Zvcm11bGEtZWRpdG9yL2Zvcm11bGEtZWRpdG9yLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksUUFHWDtBQUhELFdBQVksUUFBUTtJQUNsQiwyQkFBZSxDQUFBO0lBQ2YsaUNBQXFCLENBQUEsQ0FBQyxPQUFPO0FBQy9CLENBQUMsRUFIVyxRQUFRLEtBQVIsUUFBUSxRQUduQjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksaUJBR1g7QUFIRCxXQUFZLGlCQUFpQjtJQUMzQixrQ0FBYSxDQUFBO0lBQ2Isc0NBQWlCLENBQUEsQ0FBQyxVQUFVO0FBQzlCLENBQUMsRUFIVyxpQkFBaUIsS0FBakIsaUJBQWlCLFFBRzVCO0FBa0JEOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksWUFHWDtBQUhELFdBQVksWUFBWTtJQUN0Qiw2QkFBYSxDQUFBO0lBQ2IsNkJBQWEsQ0FBQSxDQUFDLE1BQU07QUFDdEIsQ0FBQyxFQUhXLFlBQVksS0FBWixZQUFZLFFBR3ZCO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHO0lBQzNCO1FBQ0UsSUFBSSxFQUFFLEtBQUs7UUFDWCxJQUFJLEVBQUUsR0FBRztRQUNULFdBQVcsRUFBRSxJQUFJO0tBQ2xCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsT0FBTztRQUNiLElBQUksRUFBRSxHQUFHO1FBQ1QsV0FBVyxFQUFFLElBQUk7S0FDbEI7SUFDRDtRQUNFLElBQUksRUFBRSxVQUFVO1FBQ2hCLElBQUksRUFBRSxHQUFHO1FBQ1QsV0FBVyxFQUFFLElBQUk7S0FDbEI7SUFDRDtRQUNFLElBQUksRUFBRSxRQUFRO1FBQ2QsSUFBSSxFQUFFLEdBQUc7UUFDVCxXQUFXLEVBQUUsSUFBSTtLQUNsQjtJQUNEO1FBQ0UsSUFBSSxFQUFFLGtCQUFrQjtRQUN4QixJQUFJLEVBQUUsR0FBRztRQUNULFdBQVcsRUFBRSxLQUFLO0tBQ25CO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCLElBQUksRUFBRSxHQUFHO1FBQ1QsV0FBVyxFQUFFLEtBQUs7S0FDbkI7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDovpPlhaXpobnnsbvlnovvvIzlj6/pgInmi6nmjIfmoIfmqKHlvI/miJblrZfmrrXmqKHlvI9cbiAqL1xuZXhwb3J0IGVudW0gSXRlbVR5cGUge1xuICBGaWVsZCA9ICdmaWVsZCcsIC8vIOWtl+auteaooeW8j1xuICBUZW1wbGF0ZSA9ICd0ZW1wbGF0ZScgLy8g5qih5p2/5qih5byPXG59XG5cbi8qKlxuICog6L6T5YWl5qCh6aqM5qC85byP5pa55rOVXG4gKi9cbmV4cG9ydCBlbnVtIENoZWNrRm9ybWF0TWV0aG9kIHtcbiAgc2VsZiA9ICdzZWxmJywgLy8g57uE5Lu26Ieq5bim5qCh6aqMXG4gIHNlcnZlciA9ICdzZXJ2ZXInIC8vIOiHquWumuS5ieW8guatpeagoemqjFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBpbWFnZT86IHN0cmluZzsgLy8g5Zu+5qCHdXJsXG4gIGljb24/OiBzdHJpbmc7IC8vIGljb25mb250IOWbvuagh+WQjVxuICBjbGFzc05hbWU/OiBzdHJpbmc7IC8vIOexu+WQje+8jOeUqOS6juagt+W8j+e7keWumlxuICBkZXNjcmlwdGlvbj86IHN0cmluZzsgLy8g5o+P6L+wXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVuYyB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgY2xhc3NOYW1lPzogc3RyaW5nOyAvLyDnsbvlkI3vvIznlKjkuo7moLflvI/nu5HlrppcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7IC8vIOaPj+i/sFxufVxuXG4vKipcbiAqIOWHveaVsOWIl+ihqOaooeW8j++8jOWPr+mAieaLqeWIl+ihqOaIluagkeaooeW8j1xuICovXG5leHBvcnQgZW51bSBGdW5jTGlzdFR5cGUge1xuICBMaXN0ID0gJ2xpc3QnLCAvLyDliJfooajmqKHlvI9cbiAgVHJlZSA9ICd0cmVlJyAvLyDmoJHmqKHlvI9cbn1cblxuZXhwb3J0IGNvbnN0IE9QRVJBVE9SX0xJU1QgPSBbXG4gIHtcbiAgICB0eXBlOiAnYWRkJyxcbiAgICBuYW1lOiAnKycsXG4gICAgZGVzY3JpcHRpb246ICfliqDms5UnXG4gIH0sXG4gIHtcbiAgICB0eXBlOiAnbWludXMnLFxuICAgIG5hbWU6ICctJyxcbiAgICBkZXNjcmlwdGlvbjogJ+WHj+azlSdcbiAgfSxcbiAge1xuICAgIHR5cGU6ICdtdWx0aXBseScsXG4gICAgbmFtZTogJyonLFxuICAgIGRlc2NyaXB0aW9uOiAn5LmY5rOVJ1xuICB9LFxuICB7XG4gICAgdHlwZTogJ2RpdmlkZScsXG4gICAgbmFtZTogJy8nLFxuICAgIGRlc2NyaXB0aW9uOiAn6Zmk5rOVJ1xuICB9LFxuICB7XG4gICAgdHlwZTogJ2xlZnQtcGFyZW50aGVzaXMnLFxuICAgIG5hbWU6ICcoJyxcbiAgICBkZXNjcmlwdGlvbjogJ+W3puaLrOWPtydcbiAgfSxcbiAge1xuICAgIHR5cGU6ICdyaWdodC1wYXJlbnRoZXNpcycsXG4gICAgbmFtZTogJyknLFxuICAgIGRlc2NyaXB0aW9uOiAn5Y+z5ous5Y+3J1xuICB9XG5dO1xuIl19