@masterteam/formula-builder 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -0
- package/assets/formula-builder.css +2 -0
- package/assets/i18n/ar.json +36 -0
- package/assets/i18n/en.json +36 -0
- package/fesm2022/masterteam-formula-builder.mjs +878 -0
- package/fesm2022/masterteam-formula-builder.mjs.map +1 -0
- package/package.json +40 -0
- package/types/masterteam-formula-builder.d.ts +271 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"masterteam-formula-builder.mjs","sources":["../../../../packages/masterteam/formula-builder/src/lib/services/formula-validator.service.ts","../../../../packages/masterteam/formula-builder/src/lib/services/formula-context.service.ts","../../../../packages/masterteam/formula-builder/src/lib/utils/formula-path-builder.ts","../../../../packages/masterteam/formula-builder/src/lib/formula-builder.ts","../../../../packages/masterteam/formula-builder/src/lib/formula-builder.html","../../../../packages/masterteam/formula-builder/src/lib/services/index.ts","../../../../packages/masterteam/formula-builder/src/public-api.ts","../../../../packages/masterteam/formula-builder/src/masterteam-formula-builder.ts"],"sourcesContent":["/**\r\n * Formula Validator Service\r\n * Handles real-time validation via API\r\n */\r\n\r\nimport { Injectable, inject, signal } from '@angular/core';\r\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\r\nimport {\r\n Observable,\r\n Subject,\r\n of,\r\n catchError,\r\n debounceTime,\r\n distinctUntilChanged,\r\n switchMap,\r\n tap,\r\n} from 'rxjs';\r\nimport {\r\n ValidationResult,\r\n ValidationRequest,\r\n ApiErrorResponse,\r\n} from '../models/validation-result.model';\r\n\r\n/** Default validation result for empty formulas */\r\nconst EMPTY_VALIDATION: ValidationResult = {\r\n isValid: true,\r\n errors: [],\r\n warnings: [],\r\n dependencies: [],\r\n complexity: 0,\r\n};\r\n\r\n/** Error validation result */\r\nconst ERROR_VALIDATION: ValidationResult = {\r\n isValid: false,\r\n errors: [\r\n { message: 'Validation failed', line: 1, column: 1, severity: 'Error' },\r\n ],\r\n warnings: [],\r\n dependencies: [],\r\n complexity: 0,\r\n};\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FormulaValidatorService {\r\n private readonly http = inject(HttpClient);\r\n private readonly apiUrl = '/formulas';\r\n\r\n /** Debounce time in ms */\r\n private readonly DEBOUNCE_MS = 300;\r\n\r\n /** Current validation result */\r\n private readonly _validation = signal<ValidationResult>(EMPTY_VALIDATION);\r\n\r\n /** Loading state */\r\n private readonly _isValidating = signal(false);\r\n\r\n /** Validation subject for debouncing */\r\n private readonly validateSubject = new Subject<ValidationRequest>();\r\n\r\n /** Public signals */\r\n readonly validation = this._validation.asReadonly();\r\n readonly isValidating = this._isValidating.asReadonly();\r\n\r\n constructor() {\r\n this.setupValidationStream();\r\n }\r\n\r\n /** Setup debounced validation stream */\r\n private setupValidationStream(): void {\r\n this.validateSubject\r\n .pipe(\r\n debounceTime(this.DEBOUNCE_MS),\r\n distinctUntilChanged(\r\n (a, b) =>\r\n a.formula === b.formula &&\r\n JSON.stringify(a.knownProperties) ===\r\n JSON.stringify(b.knownProperties),\r\n ),\r\n tap(() => this._isValidating.set(true)),\r\n switchMap((request) => this.callValidateApi(request)),\r\n )\r\n .subscribe((result) => {\r\n this._validation.set(result);\r\n this._isValidating.set(false);\r\n });\r\n }\r\n\r\n /** Validate formula (debounced) */\r\n validate(\r\n formula: string,\r\n knownProperties?: string[],\r\n levelSchemaId?: number,\r\n templateId?: number,\r\n ): void {\r\n // Handle empty formula\r\n if (!formula || formula.trim() === '') {\r\n this._validation.set(EMPTY_VALIDATION);\r\n return;\r\n }\r\n\r\n // Push to debounced stream\r\n this.validateSubject.next({\r\n formula,\r\n knownProperties,\r\n levelSchemaId,\r\n templateId,\r\n });\r\n }\r\n\r\n /** Validate formula immediately (no debounce) */\r\n validateImmediate(\r\n formula: string,\r\n knownProperties?: string[],\r\n levelSchemaId?: number,\r\n templateId?: number,\r\n ): Observable<ValidationResult> {\r\n if (!formula || formula.trim() === '') {\r\n return of(EMPTY_VALIDATION);\r\n }\r\n\r\n this._isValidating.set(true);\r\n\r\n return this.callValidateApi({\r\n formula,\r\n knownProperties,\r\n levelSchemaId,\r\n templateId,\r\n }).pipe(\r\n tap((result) => {\r\n this._validation.set(result);\r\n this._isValidating.set(false);\r\n }),\r\n );\r\n }\r\n\r\n /** Call validation API */\r\n private callValidateApi(\r\n request: ValidationRequest,\r\n ): Observable<ValidationResult> {\r\n return this.http\r\n .post<ValidationResult>(`${this.apiUrl}/validate`, request)\r\n .pipe(\r\n catchError((error: HttpErrorResponse) => {\r\n console.error('Validation API error:', error);\r\n\r\n // Try to extract error message\r\n const apiError = error.error as ApiErrorResponse;\r\n const message =\r\n apiError?.message ?? apiError?.error ?? 'Validation failed';\r\n\r\n return of({\r\n ...ERROR_VALIDATION,\r\n errors: [\r\n { message, line: 1, column: 1, severity: 'Error' as const },\r\n ],\r\n });\r\n }),\r\n );\r\n }\r\n\r\n /** Reset validation state */\r\n reset(): void {\r\n this._validation.set(EMPTY_VALIDATION);\r\n this._isValidating.set(false);\r\n }\r\n\r\n /** Get current validation result */\r\n getCurrentValidation(): ValidationResult {\r\n return this._validation();\r\n }\r\n\r\n /** Check if formula is valid */\r\n isValid(): boolean {\r\n return this._validation().isValid;\r\n }\r\n\r\n /** Get validation errors */\r\n getErrors() {\r\n return this._validation().errors;\r\n }\r\n\r\n /** Get validation warnings */\r\n getWarnings() {\r\n return this._validation().warnings;\r\n }\r\n\r\n /** Get formula dependencies */\r\n getDependencies() {\r\n return this._validation().dependencies;\r\n }\r\n\r\n /** Get formula complexity */\r\n getComplexity() {\r\n return this._validation().complexity;\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable, of, catchError, tap } from 'rxjs';\r\n\r\nimport type {\r\n FormulaBuilderContextResponse,\r\n FormulaBuilderNextTokensResponse,\r\n FormulaPropertyDescriptor,\r\n} from '../models/formula-context.model';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FormulaContextService {\r\n private readonly http = inject(HttpClient);\r\n private readonly apiUrl = '/formulas';\r\n\r\n private readonly contextCache = new Map<\r\n string,\r\n FormulaBuilderContextResponse\r\n >();\r\n private readonly propertiesCache = new Map<\r\n string,\r\n FormulaPropertyDescriptor[]\r\n >();\r\n private readonly nextTokensCache = new Map<\r\n string,\r\n FormulaBuilderNextTokensResponse\r\n >();\r\n\r\n loadContext(\r\n schemaId: number,\r\n contextEntityTypeKey?: string,\r\n ): Observable<FormulaBuilderContextResponse | null> {\r\n if (!schemaId) return of(null);\r\n\r\n const cacheKey = `${schemaId}:${contextEntityTypeKey ?? ''}`;\r\n const cached = this.contextCache.get(cacheKey);\r\n if (cached) {\r\n return of(cached);\r\n }\r\n\r\n const query = contextEntityTypeKey\r\n ? `?contextEntityTypeKey=${encodeURIComponent(contextEntityTypeKey)}`\r\n : '';\r\n\r\n return this.http\r\n .get<FormulaBuilderContextResponse>(\r\n `${this.apiUrl}/builder/context/${schemaId}${query}`,\r\n )\r\n .pipe(\r\n tap((response) => {\r\n if (response) {\r\n this.contextCache.set(cacheKey, response);\r\n }\r\n }),\r\n catchError((error) => {\r\n console.warn('Failed to load formula builder context:', error);\r\n return of(null);\r\n }),\r\n );\r\n }\r\n\r\n getScopeProperties(\r\n schemaId: number,\r\n component: string,\r\n tablePath: string,\r\n ): Observable<FormulaPropertyDescriptor[]> {\r\n if (!schemaId || !component || !tablePath) return of([]);\r\n\r\n const cacheKey = `${schemaId}:${component}:${tablePath}`;\r\n const cached = this.propertiesCache.get(cacheKey);\r\n if (cached) {\r\n return of(cached);\r\n }\r\n\r\n const params = new URLSearchParams({\r\n schemaId: schemaId.toString(),\r\n component,\r\n tablePath,\r\n });\r\n\r\n return this.http\r\n .get<\r\n FormulaPropertyDescriptor[]\r\n >(`${this.apiUrl}/builder/properties?${params.toString()}`)\r\n .pipe(\r\n tap((response) => {\r\n this.propertiesCache.set(cacheKey, response ?? []);\r\n }),\r\n catchError((error) => {\r\n console.warn('Failed to load formula properties:', error);\r\n return of([]);\r\n }),\r\n );\r\n }\r\n\r\n getNextTokens(\r\n schemaId: number,\r\n component: string,\r\n tablePath: string,\r\n ): Observable<FormulaBuilderNextTokensResponse | null> {\r\n if (!schemaId || !component || !tablePath) return of(null);\r\n\r\n const cacheKey = `${schemaId}:${component}:${tablePath}`;\r\n const cached = this.nextTokensCache.get(cacheKey);\r\n if (cached) {\r\n return of(cached);\r\n }\r\n\r\n const params = new URLSearchParams({\r\n schemaId: schemaId.toString(),\r\n component,\r\n tablePath,\r\n });\r\n\r\n return this.http\r\n .get<FormulaBuilderNextTokensResponse>(\r\n `${this.apiUrl}/builder/next-tokens?${params.toString()}`,\r\n )\r\n .pipe(\r\n tap((response) => {\r\n if (response) {\r\n this.nextTokensCache.set(cacheKey, response);\r\n }\r\n }),\r\n catchError((error) => {\r\n console.warn('Failed to load formula next tokens:', error);\r\n return of(null);\r\n }),\r\n );\r\n }\r\n}\r\n","import type {\r\n NextTokenRule,\r\n OperatorDescriptor,\r\n} from '../models/formula-context.model';\r\n\r\nexport type PathSegment = {\r\n operatorToken: string;\r\n value: string;\r\n};\r\n\r\nexport type SegmentMeta = PathSegment & {\r\n parameterKind?: string | null;\r\n requiresParameter: boolean;\r\n allowedValues: string[];\r\n optional: boolean;\r\n canRemove: boolean;\r\n};\r\n\r\nexport type ResolveSegmentsParams = {\r\n scope: string;\r\n segments: PathSegment[];\r\n operators: OperatorDescriptor[];\r\n baseRule?: NextTokenRule;\r\n rulesByPath: Record<string, Record<string, NextTokenRule>>;\r\n};\r\n\r\nexport function resolveSegmentsMeta({\r\n scope,\r\n segments,\r\n operators,\r\n baseRule,\r\n rulesByPath,\r\n}: ResolveSegmentsParams): SegmentMeta[] {\r\n if (!scope || segments.length === 0) {\r\n return [];\r\n }\r\n\r\n let pathBefore = scope;\r\n let blocked = false;\r\n\r\n return segments.map((segment, index) => {\r\n const isBase = index === 0 && segment.operatorToken === scope;\r\n const operator = operators.find((op) => op.token === segment.operatorToken);\r\n const rule = blocked\r\n ? undefined\r\n : isBase\r\n ? baseRule\r\n : rulesByPath[pathBefore]?.[segment.operatorToken];\r\n const parameterKind =\r\n rule?.parameterKind ?? operator?.parameterKind ?? null;\r\n const requiresParameter =\r\n operator?.requiresParameter ?? Boolean(parameterKind);\r\n const allowedValues = getAllowedValues(rule);\r\n const normalizedValue = segment.value;\r\n const isComplete = !requiresParameter || Boolean(normalizedValue);\r\n\r\n if (!blocked && isComplete) {\r\n pathBefore = appendToPath(\r\n pathBefore,\r\n segment.operatorToken,\r\n normalizedValue,\r\n isBase,\r\n );\r\n } else {\r\n blocked = true;\r\n }\r\n\r\n return {\r\n operatorToken: segment.operatorToken,\r\n value: normalizedValue,\r\n parameterKind,\r\n requiresParameter,\r\n allowedValues,\r\n optional: !requiresParameter,\r\n canRemove: !isBase,\r\n };\r\n });\r\n}\r\n\r\nexport function buildInitialSegments(\r\n scope: string,\r\n operator: OperatorDescriptor | undefined,\r\n rule: NextTokenRule | undefined,\r\n): PathSegment[] {\r\n if (!operator || !scope) return [];\r\n const parameterKind = operator.parameterKind ?? rule?.parameterKind ?? null;\r\n const requiresParameter =\r\n operator.requiresParameter ?? Boolean(parameterKind);\r\n const shouldHaveSegment = Boolean(parameterKind) || requiresParameter;\r\n if (!shouldHaveSegment) return [];\r\n\r\n return [{ operatorToken: scope, value: '' }];\r\n}\r\n\r\nexport function buildTablePath(\r\n scope: string,\r\n segments: SegmentMeta[],\r\n baseOperator: OperatorDescriptor | undefined,\r\n stopOnIncomplete: boolean,\r\n): string {\r\n if (!scope) return '';\r\n\r\n if (\r\n stopOnIncomplete &&\r\n segments.length === 0 &&\r\n (baseOperator?.requiresParameter || baseOperator?.parameterKind)\r\n ) {\r\n return '';\r\n }\r\n\r\n let path = scope;\r\n for (let index = 0; index < segments.length; index += 1) {\r\n const segment = segments[index];\r\n const isBase = index === 0 && segment.operatorToken === scope;\r\n if (!isBase) {\r\n path += `.${segment.operatorToken}`;\r\n }\r\n if (segment.value) {\r\n path += `.${segment.value}`;\r\n } else if (segment.requiresParameter && stopOnIncomplete) {\r\n return '';\r\n }\r\n }\r\n\r\n return path;\r\n}\r\n\r\nexport function getAllowedValues(rule: NextTokenRule | undefined): string[] {\r\n return rule?.allowedValues ?? [];\r\n}\r\n\r\nfunction appendToPath(\r\n basePath: string,\r\n operatorToken: string,\r\n value: string,\r\n isBase: boolean,\r\n): string {\r\n if (isBase) {\r\n if (!value) return basePath;\r\n if (!basePath) return value;\r\n return `${basePath}.${value}`;\r\n }\r\n if (!basePath) {\r\n return value ? `${operatorToken}.${value}` : operatorToken;\r\n }\r\n const withOperator = `${basePath}.${operatorToken}`;\r\n return value ? `${withOperator}.${value}` : withOperator;\r\n}\r\n","import {\r\n Component,\r\n forwardRef,\r\n input,\r\n output,\r\n signal,\r\n computed,\r\n inject,\r\n effect,\r\n OnDestroy,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NG_VALUE_ACCESSOR,\r\n} from '@angular/forms';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { Tooltip } from '@masterteam/components/tooltip';\r\nimport { RadioCards, type RadioItem } from '@masterteam/components/radio-cards';\r\nimport type { MTIcon } from '@masterteam/icons';\r\nimport { PopoverModule } from 'primeng/popover';\r\nimport { Skeleton } from 'primeng/skeleton';\r\n\r\n// Import pure UI components from @masterteam/components/formula\r\nimport {\r\n FormulaToolbar,\r\n FormulaEditor,\r\n FormulaStatusBar,\r\n type SmartBlock,\r\n type FormulaToken,\r\n createPropertyBlock,\r\n} from '@masterteam/components/formula';\r\n\r\n// Services are kept in formula-builder (backend logic)\r\nimport { FormulaValidatorService } from './services/formula-validator.service';\r\nimport { FormulaContextService } from './services/formula-context.service';\r\nimport { ValidationResult } from './models/validation-result.model';\r\nimport type {\r\n FormulaBuilderContextResponse,\r\n FormulaPropertyDescriptor,\r\n NextTokenRule,\r\n OperatorDescriptor,\r\n} from './models/formula-context.model';\r\nimport type { FormulaBuilderValue } from './models/formula-builder-value.model';\r\nimport {\r\n buildInitialSegments,\r\n buildTablePath,\r\n getAllowedValues,\r\n resolveSegmentsMeta,\r\n type PathSegment,\r\n type SegmentMeta,\r\n} from './utils/formula-path-builder';\r\n\r\nconst DEFAULT_SCOPE_ICON: MTIcon = 'general.placeholder';\r\nconst SCOPE_ICON_MAP: Record<string, MTIcon> = {\r\n Current: 'map.marker-pin-01',\r\n Level: 'map.marker-pin-01',\r\n Parent: 'arrow.arrow-up',\r\n Children: 'user.users-01',\r\n Descendants: 'custom.hierarchy-structure',\r\n Modules: 'file.folder-closed',\r\n};\r\n\r\n@Component({\r\n selector: 'mt-formula-builder',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n FormsModule,\r\n Card,\r\n Button,\r\n SelectField,\r\n Tooltip,\r\n RadioCards,\r\n PopoverModule,\r\n Skeleton,\r\n FormulaToolbar,\r\n FormulaStatusBar,\r\n FormulaEditor,\r\n ],\r\n templateUrl: './formula-builder.html',\r\n host: {\r\n class: 'block',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => FormulaBuilder),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class FormulaBuilder implements ControlValueAccessor, OnDestroy {\r\n private readonly validatorService = inject(FormulaValidatorService);\r\n private readonly contextService = inject(FormulaContextService);\r\n\r\n /** Reference to the formula editor */\r\n private readonly editor = viewChild<FormulaEditor>('formulaEditor');\r\n\r\n // ===== INPUTS =====\r\n\r\n /** Properties per table path (e.g., \"Current\", \"Children.Project\") */\r\n readonly propertiesByPath = input<\r\n Record<string, { key: string; name?: string }[]>\r\n >({});\r\n\r\n /** Level schema ID for validation context */\r\n readonly levelSchemaId = input<number>();\r\n\r\n /** Template ID for validation context */\r\n readonly templateId = input<number>();\r\n\r\n /** Placeholder text */\r\n readonly placeholder = input('Enter formula...');\r\n\r\n /** Hide the top toolbar */\r\n readonly hideToolbar = input(false);\r\n\r\n /** Hide the status bar */\r\n readonly hideStatusBar = input(false);\r\n\r\n // ===== OUTPUTS =====\r\n\r\n /** Emits validation result on change */\r\n readonly validationChange = output<ValidationResult>();\r\n\r\n /** Emits when tokens change */\r\n readonly tokensChange = output<FormulaToken[]>();\r\n\r\n // ===== STATE =====\r\n\r\n /** Editor focus state */\r\n readonly hasFocus = signal(false);\r\n\r\n /** Form control value */\r\n private readonly expressionValue = signal('');\r\n private readonly builderValue = signal<FormulaToken[]>([]);\r\n\r\n /** Tokens for the editor */\r\n readonly tokens = signal<FormulaToken[]>([]);\r\n\r\n /** Track last synced builder JSON to avoid loops */\r\n private lastBuilderJson = '';\r\n\r\n /** ControlValueAccessor callbacks */\r\n private onChange: (value: FormulaBuilderValue) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n /** Disabled state */\r\n private readonly isDisabled = signal(false);\r\n\r\n /** Validation result from service */\r\n readonly validation = this.validatorService.validation;\r\n\r\n /** Is validation in progress */\r\n readonly isValidating = this.validatorService.isValidating;\r\n\r\n /** Builder context from API */\r\n readonly builderContext = signal<FormulaBuilderContextResponse | null>(null);\r\n\r\n /** Function categories from context */\r\n readonly functionCategories = computed(\r\n () => this.builderContext()?.functions?.categories ?? [],\r\n );\r\n\r\n /** Is builder context loading */\r\n readonly isContextLoading = signal(false);\r\n\r\n private contextRequestId = 0;\r\n\r\n /** Properties loaded from API */\r\n private readonly propertiesByPathApi = signal<\r\n Record<string, FormulaPropertyDescriptor[]>\r\n >({});\r\n\r\n /** Current property list loading path */\r\n private readonly propertyLoadingPath = signal<string | null>(null);\r\n\r\n constructor() {\r\n // Validate when formula changes\r\n effect(() => {\r\n const formula = this.expressionValue();\r\n if (formula && formula.trim().length > 0) {\r\n this.validatorService.validate(\r\n formula,\r\n undefined,\r\n this.levelSchemaId(),\r\n this.templateId(),\r\n );\r\n }\r\n });\r\n\r\n // Emit validation changes\r\n effect(() => {\r\n const validation = this.validation();\r\n this.validationChange.emit(validation);\r\n });\r\n\r\n // Load builder context when schema changes\r\n effect(() => {\r\n const schemaId = this.levelSchemaId();\r\n\r\n if (!schemaId) {\r\n this.builderContext.set(null);\r\n this.propertiesByPathApi.set({});\r\n this.nextTokenRulesByPath.set({});\r\n this.isContextLoading.set(false);\r\n return;\r\n }\r\n\r\n const requestId = ++this.contextRequestId;\r\n this.isContextLoading.set(true);\r\n this.nextTokenRulesByPath.set({});\r\n this.contextService.loadContext(schemaId).subscribe((context) => {\r\n if (requestId !== this.contextRequestId) {\r\n return;\r\n }\r\n\r\n this.builderContext.set(context);\r\n this.isContextLoading.set(false);\r\n\r\n if (!context) {\r\n return;\r\n }\r\n\r\n if (context.currentProperties?.length) {\r\n const scalarOperators =\r\n context.schemaDescriptor?.operators?.filter(\r\n (operator) =>\r\n operator.cardinality === 'scalar' &&\r\n !operator.requiresParameter &&\r\n !operator.parameterKind,\r\n ) ?? [];\r\n const scopedProperties = scalarOperators.reduce(\r\n (acc, operator) => ({\r\n ...acc,\r\n [operator.token]: context.currentProperties,\r\n }),\r\n {} as Record<string, FormulaPropertyDescriptor[]>,\r\n );\r\n this.propertiesByPathApi.update((current) => ({\r\n ...current,\r\n ...scopedProperties,\r\n }));\r\n }\r\n });\r\n });\r\n\r\n // Ensure selected scope exists in available options\r\n effect(() => {\r\n const scopes = this.availableScopes();\r\n if (scopes.length === 0) return;\r\n const current = this.propertyScope();\r\n if (!scopes.some((scope) => scope.key === current)) {\r\n this.setPropertyScope(scopes[0].key);\r\n }\r\n });\r\n\r\n // Fetch properties for the selected table path\r\n effect(() => {\r\n const schemaId = this.levelSchemaId();\r\n const tablePath = this.resolvedTablePath();\r\n const component = this.propertiesComponent();\r\n const context = this.builderContext();\r\n\r\n if (!schemaId || !tablePath || !component || !context) {\r\n this.propertyLoadingPath.set(null);\r\n return;\r\n }\r\n\r\n const existing = this.propertiesByPathApi()[tablePath];\r\n if (existing !== undefined) {\r\n this.propertyLoadingPath.set(null);\r\n return;\r\n }\r\n\r\n this.propertyLoadingPath.set(tablePath);\r\n this.contextService\r\n .getScopeProperties(schemaId, component, tablePath)\r\n .subscribe((props) => {\r\n this.propertiesByPathApi.update((current) => ({\r\n ...current,\r\n [tablePath]: props ?? [],\r\n }));\r\n if (this.propertyLoadingPath() === tablePath) {\r\n this.propertyLoadingPath.set(null);\r\n }\r\n });\r\n });\r\n\r\n // Fetch next-token rules for the current table path\r\n effect(() => {\r\n const schemaId = this.levelSchemaId();\r\n const tablePath = this.resolvedTablePath();\r\n const component = this.propertiesComponent();\r\n\r\n if (!schemaId || !tablePath || !component) return;\r\n\r\n if (this.nextTokenRulesByPath()[tablePath]) return;\r\n\r\n this.contextService\r\n .getNextTokens(schemaId, component, tablePath)\r\n .subscribe((response) => {\r\n if (!response) return;\r\n this.nextTokenRulesByPath.update((current) => ({\r\n ...current,\r\n [tablePath]: response.nextTokenRules ?? {},\r\n }));\r\n });\r\n });\r\n\r\n // Keep base segment in sync with scope metadata\r\n effect(() => {\r\n const scope = this.propertyScope();\r\n const operator = this.baseOperator();\r\n const shouldHaveSegment =\r\n Boolean(operator?.parameterKind) ||\r\n Boolean(operator?.requiresParameter);\r\n const segments = this.propertyPathSegments();\r\n const hasBase = segments[0]?.operatorToken === scope;\r\n\r\n if (shouldHaveSegment && !hasBase) {\r\n this.propertyPathSegments.set(\r\n buildInitialSegments(scope, operator, this.baseRule()),\r\n );\r\n return;\r\n }\r\n\r\n if (!shouldHaveSegment && hasBase) {\r\n this.propertyPathSegments.set(segments.slice(1));\r\n }\r\n });\r\n\r\n // Normalize segment values when allowed values change\r\n effect(() => {\r\n const meta = this.pathSegments();\r\n const segments = this.propertyPathSegments();\r\n if (meta.length !== segments.length) return;\r\n\r\n let changed = false;\r\n const next = segments.map((segment, index) => {\r\n const normalized = meta[index]?.value ?? segment.value;\r\n if (segment.value !== normalized) {\r\n changed = true;\r\n return { ...segment, value: normalized };\r\n }\r\n return segment;\r\n });\r\n\r\n if (changed) {\r\n this.propertyPathSegments.set(next);\r\n }\r\n });\r\n\r\n // Ensure selected field exists in current options\r\n effect(() => {\r\n const options = this.propertyOptions();\r\n const current = this.propertyFieldKey();\r\n\r\n if (options.length === 0) {\r\n if (current) this.propertyFieldKey.set('');\r\n return;\r\n }\r\n\r\n if (current && !options.some((prop) => prop.key === current)) {\r\n this.propertyFieldKey.set('');\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.validatorService.reset();\r\n }\r\n\r\n // ===== ControlValueAccessor =====\r\n\r\n writeValue(value: FormulaBuilderValue | null): void {\r\n if (!value) {\r\n this.expressionValue.set('');\r\n this.builderValue.set([]);\r\n this.tokens.set([]);\r\n this.lastBuilderJson = '';\r\n const editor = this.editor();\r\n if (editor) {\r\n editor.writeValue([]);\r\n }\r\n this.validatorService.reset();\r\n return;\r\n }\r\n\r\n this.expressionValue.set(value.expression ?? '');\r\n const builder = Array.isArray(value.builder) ? value.builder : [];\r\n this.builderValue.set(builder);\r\n\r\n if (builder.length === 0) {\r\n this.tokens.set([]);\r\n this.lastBuilderJson = '';\r\n const editor = this.editor();\r\n if (editor) {\r\n editor.writeValue([]);\r\n }\r\n return;\r\n }\r\n\r\n const serialized = JSON.stringify(builder);\r\n if (serialized === this.lastBuilderJson) {\r\n return;\r\n }\r\n\r\n this.tokens.set(builder);\r\n const editor = this.editor();\r\n if (editor) {\r\n editor.writeValue(builder);\r\n }\r\n this.lastBuilderJson = serialized;\r\n }\r\n\r\n registerOnChange(fn: (value: FormulaBuilderValue) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled.set(isDisabled);\r\n }\r\n\r\n /** Handle formula change from editor */\r\n onFormulaChange(newFormula: string): void {\r\n this.expressionValue.set(newFormula);\r\n this.emitValueChange();\r\n }\r\n\r\n /** Handle block insert from toolbar */\r\n onBlockInsert(block: SmartBlock): void {\r\n const editor = this.editor();\r\n if (editor) {\r\n editor.addBlock(block);\r\n }\r\n }\r\n\r\n /** Handle tokens change */\r\n onTokensChange(newTokens: FormulaToken[]): void {\r\n this.tokens.set(newTokens);\r\n const json = JSON.stringify(newTokens);\r\n this.lastBuilderJson = json;\r\n this.builderValue.set(newTokens);\r\n this.tokensChange.emit(newTokens);\r\n this.emitValueChange();\r\n }\r\n\r\n onEditorFocus(): void {\r\n this.hasFocus.set(true);\r\n }\r\n\r\n onEditorBlur(): void {\r\n this.hasFocus.set(false);\r\n this.onTouched();\r\n }\r\n\r\n private emitValueChange(): void {\r\n this.onChange({\r\n expression: this.expressionValue(),\r\n builder: this.builderValue(),\r\n });\r\n }\r\n\r\n // ===== PUBLIC METHODS =====\r\n\r\n /** Clear the formula */\r\n clear(): void {\r\n this.expressionValue.set('');\r\n this.tokens.set([]);\r\n this.builderValue.set([]);\r\n this.lastBuilderJson = '';\r\n const editor = this.editor();\r\n if (editor) {\r\n editor.writeValue([]);\r\n }\r\n this.validatorService.reset();\r\n this.emitValueChange();\r\n }\r\n\r\n // ===== PROPERTY COMPOSER =====\r\n\r\n readonly propertyScope = signal<string>('');\r\n\r\n readonly propertyPathSegments = signal<PathSegment[]>([]);\r\n\r\n readonly propertyFieldKey = signal('');\r\n\r\n private readonly nextTokenRulesByPath = signal<\r\n Record<string, Record<string, NextTokenRule>>\r\n >({});\r\n\r\n readonly contextOperators = computed<OperatorDescriptor[]>(() => {\r\n return this.builderContext()?.schemaDescriptor?.operators ?? [];\r\n });\r\n\r\n readonly baseOperator = computed(() =>\r\n this.contextOperators().find((op) => op.token === this.propertyScope()),\r\n );\r\n\r\n readonly baseRule = computed(() => {\r\n const scope = this.propertyScope();\r\n return this.builderContext()?.schemaDescriptor?.nextTokenRules?.[scope];\r\n });\r\n\r\n readonly availableScopes = computed(() => {\r\n const operators = this.contextOperators();\r\n if (operators.length === 0) return [];\r\n return operators.map((operator) => ({\r\n key: operator.token,\r\n label: `@${operator.token}`,\r\n requiresParam: operator.requiresParameter ?? false,\r\n optional: !operator.requiresParameter,\r\n }));\r\n });\r\n\r\n /** Radio card options for scope selection */\r\n readonly scopeOptions = computed<RadioItem[]>(() =>\r\n this.availableScopes().map((scope) => ({\r\n id: scope.key,\r\n name: scope.key,\r\n icon: SCOPE_ICON_MAP[scope.key] ?? DEFAULT_SCOPE_ICON,\r\n })),\r\n );\r\n\r\n /** Handle scope selection from radio cards */\r\n onScopeChange(item: RadioItem): void {\r\n this.setPropertyScope(String(item.id));\r\n }\r\n\r\n readonly pathSegments = computed<SegmentMeta[]>(() => {\r\n const scope = this.propertyScope();\r\n return resolveSegmentsMeta({\r\n scope,\r\n segments: this.propertyPathSegments(),\r\n operators: this.contextOperators(),\r\n baseRule: this.baseRule(),\r\n rulesByPath: this.nextTokenRulesByPath(),\r\n });\r\n });\r\n\r\n readonly isDirectAccess = computed(() => {\r\n const operator = this.baseOperator();\r\n const needsParameter =\r\n Boolean(operator?.parameterKind) || Boolean(operator?.requiresParameter);\r\n return !needsParameter && this.pathSegments().length === 0;\r\n });\r\n\r\n readonly propertyTablePath = computed(() =>\r\n buildTablePath(\r\n this.propertyScope(),\r\n this.pathSegments(),\r\n this.baseOperator(),\r\n false,\r\n ),\r\n );\r\n\r\n readonly resolvedTablePath = computed(() =>\r\n buildTablePath(\r\n this.propertyScope(),\r\n this.pathSegments(),\r\n this.baseOperator(),\r\n true,\r\n ),\r\n );\r\n\r\n readonly currentNextTokenRules = computed(() => {\r\n const path = this.resolvedTablePath();\r\n if (!path) return {};\r\n return this.nextTokenRulesByPath()[path] ?? {};\r\n });\r\n\r\n readonly nextOperatorOptions = computed(() => {\r\n const rules = this.currentNextTokenRules();\r\n const operators = this.contextOperators();\r\n return Object.keys(rules)\r\n .map((token) => {\r\n const rule = rules[token];\r\n const operator = operators.find((item) => item.token === token);\r\n const parameterKind =\r\n rule?.parameterKind ?? operator?.parameterKind ?? null;\r\n const requiresParameter =\r\n operator?.requiresParameter ?? Boolean(parameterKind);\r\n const allowedValues = getAllowedValues(rule);\r\n return {\r\n token,\r\n rule,\r\n requiresParameter,\r\n allowedValues,\r\n };\r\n })\r\n .filter(\r\n (option) =>\r\n option.allowedValues.length > 0 || !option.requiresParameter,\r\n );\r\n });\r\n\r\n readonly canAddNextSegment = computed(() => {\r\n if (this.nextOperatorOptions().length === 0) return false;\r\n const segments = this.pathSegments();\r\n if (segments.length === 0 || !segments[0].value) {\r\n return false;\r\n }\r\n return segments.every(\r\n (segment) => !segment.requiresParameter || Boolean(segment.value),\r\n );\r\n });\r\n\r\n readonly propertiesComponent = computed(() => {\r\n const contextKey = this.builderContext()?.contextEntityTypeKey;\r\n return contextKey;\r\n });\r\n\r\n readonly mergedPropertiesByPath = computed<\r\n Record<string, FormulaPropertyDescriptor[]>\r\n >(() => {\r\n const merged: Record<string, FormulaPropertyDescriptor[]> = {\r\n ...this.propertiesByPath(),\r\n };\r\n const apiProps = this.propertiesByPathApi();\r\n Object.entries(apiProps).forEach(([path, props]) => {\r\n if (props && props.length > 0) {\r\n merged[path] = props;\r\n }\r\n });\r\n return merged;\r\n });\r\n\r\n readonly isPropertyLoading = computed(() => {\r\n const path = this.resolvedTablePath();\r\n return Boolean(path) && this.propertyLoadingPath() === path;\r\n });\r\n\r\n readonly propertyOptions = computed(() => {\r\n const path = this.resolvedTablePath();\r\n if (!path) return [];\r\n const byPath = this.mergedPropertiesByPath()[path];\r\n const list = byPath && byPath.length > 0 ? byPath : [];\r\n return list.map((prop) => ({\r\n key: prop.key,\r\n name: prop.name ?? prop.key,\r\n }));\r\n });\r\n\r\n readonly selectedProperty = computed(() => {\r\n const key = this.propertyFieldKey();\r\n return this.propertyOptions().find((prop) => prop.key === key) ?? null;\r\n });\r\n\r\n readonly canInsertProperty = computed(() => {\r\n if (!this.selectedProperty()) return false;\r\n return Boolean(this.resolvedTablePath());\r\n });\r\n\r\n setPropertyScope(scope: string): void {\r\n if (this.propertyScope() === scope) {\r\n return;\r\n }\r\n this.propertyScope.set(scope);\r\n this.propertyPathSegments.set(\r\n buildInitialSegments(\r\n scope,\r\n this.contextOperators().find((op) => op.token === scope),\r\n this.builderContext()?.schemaDescriptor?.nextTokenRules?.[scope],\r\n ),\r\n );\r\n this.propertyFieldKey.set('');\r\n }\r\n\r\n setPathSegmentValue(index: number, value: string | null): void {\r\n this.propertyPathSegments.update((segments) => {\r\n // Update the segment at the given index and remove all segments after it\r\n // because subsequent segments depend on previous values\r\n const updated = segments.slice(0, index + 1);\r\n updated[index] = { ...updated[index], value: value ?? '' };\r\n return updated;\r\n });\r\n }\r\n\r\n addNextSegment(operatorToken: string): void {\r\n const value = '';\r\n\r\n this.propertyPathSegments.update((segments) => [\r\n ...segments,\r\n { operatorToken, value },\r\n ]);\r\n }\r\n\r\n onAddSegmentSelection(\r\n operatorToken: string,\r\n popover: { hide: () => void },\r\n ): void {\r\n popover.hide();\r\n this.addNextSegment(operatorToken);\r\n }\r\n\r\n removePathSegment(index: number): void {\r\n this.propertyPathSegments.update((segments) =>\r\n segments.filter((_, i) => i !== index),\r\n );\r\n }\r\n\r\n segmentOptions(index: number): { key: string; name: string }[] {\r\n const segment = this.pathSegments()[index];\r\n if (!segment) return [];\r\n return segment.allowedValues.map((value) => ({\r\n key: value,\r\n name: value,\r\n }));\r\n }\r\n\r\n insertSelectedProperty(insertBlock: (block: SmartBlock) => void): void {\r\n const prop = this.selectedProperty();\r\n if (!prop) return;\r\n\r\n if (!this.canInsertProperty()) return;\r\n\r\n const tablePath = this.resolvedTablePath();\r\n if (!tablePath) return;\r\n const display = prop.name ?? prop.key;\r\n const block = createPropertyBlock(\r\n `@${tablePath}::${prop.key}`,\r\n 'current',\r\n display,\r\n );\r\n insertBlock(block);\r\n }\r\n}\r\n","<mt-card\r\n headless\r\n [class.ring-2]=\"hasFocus()\"\r\n [class.ring-primary]=\"hasFocus()\"\r\n [paddingless]=\"true\"\r\n>\r\n <div\r\n *transloco=\"let t; prefix: 'formulaBuilder'\"\r\n class=\"flex flex-col overflow-hidden\"\r\n >\r\n <!-- Toolbar - Pass data via inputs (pure component) -->\r\n @if (!hideToolbar()) {\r\n <mt-formula-toolbar\r\n [functionCategories]=\"functionCategories()\"\r\n (onBlockInsert)=\"onBlockInsert($event)\"\r\n >\r\n <ng-template #properties let-insertBlock=\"insertBlock\">\r\n @if (isContextLoading()) {\r\n <div class=\"flex flex-col gap-4 p-4\">\r\n <div class=\"flex items-center justify-between gap-4\">\r\n <p-skeleton\r\n width=\"18rem\"\r\n height=\"2.5rem\"\r\n styleClass=\"rounded-md\"\r\n />\r\n <p-skeleton\r\n width=\"7rem\"\r\n height=\"2.5rem\"\r\n styleClass=\"rounded-md\"\r\n />\r\n </div>\r\n <div class=\"flex items-center gap-4\">\r\n <div\r\n class=\"flex min-h-11 min-w-0 flex-1 flex-col gap-2 rounded-lg bg-slate-50 px-3 py-2 dark:bg-slate-800/50\"\r\n >\r\n <div class=\"flex items-center gap-2\">\r\n <p-skeleton\r\n width=\"3rem\"\r\n height=\"1rem\"\r\n styleClass=\"rounded-md\"\r\n />\r\n <div\r\n class=\"h-4 w-px shrink-0 bg-slate-200 dark:bg-slate-700\"\r\n ></div>\r\n <p-skeleton\r\n class=\"flex-1\"\r\n height=\"2rem\"\r\n styleClass=\"rounded-md\"\r\n />\r\n </div>\r\n <div\r\n class=\"flex items-center gap-2 border-t border-slate-200 pt-2 dark:border-slate-700\"\r\n >\r\n <p-skeleton\r\n width=\"3rem\"\r\n height=\"1rem\"\r\n styleClass=\"rounded-md\"\r\n />\r\n <div\r\n class=\"h-4 w-px shrink-0 bg-slate-200 dark:bg-slate-700\"\r\n ></div>\r\n <p-skeleton\r\n class=\"flex-1\"\r\n height=\"2.5rem\"\r\n styleClass=\"rounded-md\"\r\n />\r\n </div>\r\n <p-skeleton height=\"2rem\" styleClass=\"rounded-md\" />\r\n </div>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-col gap-4 p-4\">\r\n <!-- Scope Selection - Full width, centered -->\r\n <div class=\"flex items-center justify-between gap-4\">\r\n <mt-radio-cards\r\n [options]=\"scopeOptions()\"\r\n [activeId]=\"propertyScope()\"\r\n (selectionChange)=\"onScopeChange($event)\"\r\n size=\"small\"\r\n />\r\n </div>\r\n\r\n <!-- Path + Field + Preview Row -->\r\n <div class=\"flex items-center gap-4\">\r\n <!-- Path Container - Flexible -->\r\n <div\r\n class=\"flex min-h-11 min-w-0 flex-1 flex-col gap-2 rounded-lg bg-slate-50 px-3 py-2 dark:bg-slate-800/50\"\r\n >\r\n <div class=\"flex items-center gap-2\">\r\n <span\r\n class=\"shrink-0 text-xs font-semibold uppercase tracking-wider text-slate-400\"\r\n >Path</span\r\n >\r\n <div\r\n class=\"h-4 w-px shrink-0 bg-slate-200 dark:bg-slate-700\"\r\n ></div>\r\n <div class=\"flex min-w-0 flex-1 items-center gap-2\">\r\n @if (isDirectAccess()) {\r\n <span\r\n class=\"rounded-md bg-emerald-100 px-2.5 py-1 text-xs font-medium text-emerald-600 dark:bg-emerald-900/30 dark:text-emerald-400\"\r\n >\r\n ✓ Direct Access\r\n </span>\r\n } @else if (pathSegments().length === 0) {\r\n <span class=\"text-xs italic text-slate-400\"\r\n >No path configured</span\r\n >\r\n } @else {\r\n <div\r\n class=\"flex min-w-0 flex-1 items-center gap-1.5 overflow-x-auto\"\r\n >\r\n @for (\r\n segment of pathSegments();\r\n track $index;\r\n let segmentIndex = $index\r\n ) {\r\n @if (segmentIndex > 0) {\r\n <span\r\n class=\"shrink-0 text-slate-300 dark:text-slate-600\"\r\n >›</span\r\n >\r\n }\r\n <mt-button\r\n type=\"button\"\r\n [label]=\"\r\n segment.value ||\r\n 'Select ' + segment.operatorToken\r\n \"\r\n icon=\"arrow.chevron-down\"\r\n [outlined]=\"true\"\r\n size=\"small\"\r\n [severity]=\"\r\n segment.value ? 'primary' : 'secondary'\r\n \"\r\n [iconPos]=\"'end'\"\r\n (onClick)=\"pathPopover.toggle($event)\"\r\n ></mt-button>\r\n\r\n <p-popover\r\n #pathPopover\r\n [style]=\"{ width: 'max-content' }\"\r\n appendTo=\"body\"\r\n >\r\n <div class=\"p-2\">\r\n <div\r\n class=\"mb-2 text-xs font-semibold uppercase text-slate-400\"\r\n >\r\n Select {{ segment.operatorToken }}\r\n </div>\r\n <div class=\"flex flex-col gap-1\">\r\n @for (\r\n option of segmentOptions(segmentIndex);\r\n track option.key\r\n ) {\r\n <mt-button\r\n type=\"button\"\r\n [label]=\"option.name\"\r\n [icon]=\"\r\n segment.value === option.key\r\n ? 'general.check'\r\n : 'general.minus'\r\n \"\r\n [iconPos]=\"'end'\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n [styleClass]=\"\r\n 'w-full justify-start rounded-md px-2.5 py-1.5 text-left text-xs font-medium transition-colors ' +\r\n (segment.value === option.key\r\n ? 'bg-primary text-white'\r\n : 'text-slate-600 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-700')\r\n \"\r\n (onClick)=\"\r\n setPathSegmentValue(\r\n segmentIndex,\r\n option.key\r\n );\r\n pathPopover.hide()\r\n \"\r\n ></mt-button>\r\n }\r\n </div>\r\n @if (segment.optional) {\r\n <mt-button\r\n type=\"button\"\r\n label=\"Clear\"\r\n [outlined]=\"true\"\r\n icon=\"general.x-close\"\r\n [iconPos]=\"'end'\"\r\n size=\"small\"\r\n severity=\"danger\"\r\n styleClass=\"mt-2 w-full rounded-md border border-slate-200 py-1 text-xs text-slate-400 hover:bg-slate-50 dark:border-slate-700\"\r\n (onClick)=\"\r\n setPathSegmentValue(segmentIndex, null);\r\n pathPopover.hide()\r\n \"\r\n ></mt-button>\r\n }\r\n </div>\r\n </p-popover>\r\n\r\n @if (\r\n segment.canRemove &&\r\n segmentIndex === pathSegments().length - 1\r\n ) {\r\n <mt-button\r\n type=\"button\"\r\n icon=\"general.x-close\"\r\n size=\"small\"\r\n severity=\"danger\"\r\n styleClass=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-red-500 text-white hover:bg-red-600\"\r\n (onClick)=\"removePathSegment(segmentIndex)\"\r\n ></mt-button>\r\n }\r\n }\r\n <mt-button\r\n type=\"button\"\r\n icon=\"general.plus\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n [disabled]=\"!canAddNextSegment()\"\r\n [class.hidden]=\"!canAddNextSegment()\"\r\n styleClass=\"flex size-6 shrink-0 items-center justify-center rounded-md bg-primary text-xs font-bold text-white hover:opacity-90 disabled:opacity-50\"\r\n (onClick)=\"nextOperatorPopover.toggle($event)\"\r\n ></mt-button>\r\n </div>\r\n }\r\n <p-popover\r\n #nextOperatorPopover\r\n [style]=\"{ width: 'max-content' }\"\r\n appendTo=\"body\"\r\n >\r\n <div class=\"p-2\">\r\n <div\r\n class=\"mb-2 text-xs font-semibold uppercase text-slate-400\"\r\n >\r\n Add Segment\r\n </div>\r\n <div class=\"flex flex-col gap-1\">\r\n @for (\r\n option of nextOperatorOptions();\r\n track option.token\r\n ) {\r\n <mt-button\r\n type=\"button\"\r\n [label]=\"option.token\"\r\n icon=\"general.plus\"\r\n [iconPos]=\"'end'\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n styleClass=\"w-full justify-start rounded-md px-2.5 py-1.5 text-left text-xs font-medium transition-colors text-slate-600 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-700\"\r\n (onClick)=\"\r\n onAddSegmentSelection(\r\n option.token,\r\n nextOperatorPopover\r\n )\r\n \"\r\n ></mt-button>\r\n }\r\n </div>\r\n </div>\r\n </p-popover>\r\n </div>\r\n </div>\r\n\r\n <!-- Field Selection - Under Path -->\r\n <div\r\n class=\"flex items-center gap-2 border-t border-slate-200 pt-2 dark:border-slate-700\"\r\n >\r\n <span\r\n class=\"shrink-0 text-xs font-semibold uppercase tracking-wider text-slate-400\"\r\n >Field</span\r\n >\r\n <div\r\n class=\"h-4 w-px shrink-0 bg-slate-200 dark:bg-slate-700\"\r\n ></div>\r\n @if (isPropertyLoading()) {\r\n <p-skeleton\r\n class=\"flex-1\"\r\n height=\"2.5rem\"\r\n styleClass=\"rounded-md\"\r\n />\r\n } @else {\r\n <mt-select-field\r\n class=\"flex-1\"\r\n [label]=\"''\"\r\n [filter]=\"true\"\r\n [hasPlaceholderPrefix]=\"false\"\r\n placeholder=\"Select...\"\r\n [(ngModel)]=\"propertyFieldKey\"\r\n [options]=\"propertyOptions()\"\r\n optionLabel=\"name\"\r\n optionValue=\"key\"\r\n [size]=\"'small'\"\r\n />\r\n }\r\n </div>\r\n <div\r\n class=\"w-full truncate rounded-lg bg-amber-100 px-3 py-2 text-sm font-semibold text-amber-700 shadow-sm hover:bg-amber-200 dark:bg-amber-900/30 dark:text-amber-300 dark:hover:bg-amber-900/50\"\r\n [mtTooltip]=\"\r\n '@' +\r\n propertyTablePath() +\r\n '::' +\r\n (selectedProperty()?.key ?? '...')\r\n \"\r\n tooltipPosition=\"top\"\r\n >\r\n @{{ propertyTablePath() }}::{{\r\n selectedProperty()?.key ?? \"...\"\r\n }}\r\n </div>\r\n <div class=\"flex justify-end\">\r\n <mt-button\r\n type=\"button\"\r\n label=\"Insert\"\r\n icon=\"general.plus\"\r\n severity=\"primary\"\r\n [disabled]=\"!canInsertProperty()\"\r\n (onClick)=\"insertSelectedProperty(insertBlock)\"\r\n ></mt-button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n </mt-formula-toolbar>\r\n }\r\n\r\n <!-- Editor Area -->\r\n <div class=\"p-3\">\r\n <mt-formula-editor\r\n #formulaEditor\r\n [placeholder]=\"placeholder()\"\r\n [initialTokens]=\"tokens()\"\r\n (formulaChange)=\"onFormulaChange($event)\"\r\n (tokensChange)=\"onTokensChange($event)\"\r\n (onFocus)=\"onEditorFocus()\"\r\n (onBlur)=\"onEditorBlur()\"\r\n />\r\n </div>\r\n\r\n <!-- Status Bar - Pass data via inputs (pure component) -->\r\n @if (!hideStatusBar()) {\r\n <mt-formula-status-bar [validation]=\"validation()\" />\r\n }\r\n </div>\r\n</mt-card>\r\n","/**\r\n * Services barrel export\r\n */\r\n\r\nexport * from './formula-context.service';\r\nexport * from './formula-validator.service';\r\n","/**\r\n * Public API Surface of @masterteam/formula-builder\r\n *\r\n * This package provides the FormulaBuilder component which wraps\r\n * pure UI components from @masterteam/components/formula with\r\n * backend services for validation and context loading.\r\n *\r\n * Architecture:\r\n * - UI Components: imported from @masterteam/components/formula (pure, no services)\r\n * - Services: FormulaContextService, FormulaValidatorService (backend logic)\r\n * - FormulaBuilder: Main wrapper that connects UI with services\r\n */\r\n\r\n// Main component\r\nexport * from './lib/formula-builder';\r\n\r\n// Services (backend logic only)\r\nexport * from './lib/services/index';\r\n\r\n// Re-export models from base package for convenience\r\nexport {\r\n type SmartBlock,\r\n type BlockType,\r\n type ArgumentSlot,\r\n type FormulaToken,\r\n type TokenType,\r\n type DragBehavior,\r\n type ValidationResult,\r\n type ValidationError,\r\n type FunctionDefinition,\r\n type FunctionCategoryGroup,\r\n type OperatorDefinition,\r\n createFunctionBlock,\r\n createPropertyBlock,\r\n createOperatorBlock,\r\n createLiteralBlock,\r\n} from '@masterteam/components/formula';\r\n\r\n// Export validation-specific models\r\nexport type {\r\n ValidationRequest,\r\n FunctionCatalogResponse,\r\n ApiErrorResponse,\r\n} from './lib/models/validation-result.model';\r\n\r\n// Export value model for ControlValueAccessor usage\r\nexport type { FormulaBuilderValue } from './lib/models/formula-builder-value.model';\r\n\r\n// Export builder context models\r\nexport type {\r\n FormulaBuilderContextResponse,\r\n FormulaPropertyDescriptor,\r\n FormulaEngineSchemaDescriptor,\r\n OperatorDescriptor,\r\n NextTokenRule,\r\n} from './lib/models/formula-context.model';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@masterteam/formula-builder",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"directory": "../../../dist/masterteam/formula-builder",
|
|
6
|
+
"linkDirectory": true,
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"peerDependencies": {
|
|
10
|
+
"@angular/common": "^21.0.3",
|
|
11
|
+
"@angular/core": "^21.0.3",
|
|
12
|
+
"@angular/forms": "^21.0.3",
|
|
13
|
+
"@angular/cdk": "^21.0.2",
|
|
14
|
+
"@primeuix/themes": "^2.0.2",
|
|
15
|
+
"@tailwindcss/postcss": "^4.1.17",
|
|
16
|
+
"@jsverse/transloco": "^8.0.2",
|
|
17
|
+
"postcss": "^8.5.6",
|
|
18
|
+
"primeng": "21.0.1",
|
|
19
|
+
"rxjs": "^7.8.2",
|
|
20
|
+
"tailwindcss": "^4.1.17",
|
|
21
|
+
"tailwindcss-primeui": "^0.6.1",
|
|
22
|
+
"@masterteam/components": "^0.0.81",
|
|
23
|
+
"@masterteam/icons": "^0.0.12"
|
|
24
|
+
},
|
|
25
|
+
"sideEffects": false,
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"default": "./fesm2022/masterteam-formula-builder.mjs",
|
|
29
|
+
"types": "./types/masterteam-formula-builder.d.ts"
|
|
30
|
+
},
|
|
31
|
+
"./package.json": {
|
|
32
|
+
"default": "./package.json"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"module": "fesm2022/masterteam-formula-builder.mjs",
|
|
36
|
+
"typings": "types/masterteam-formula-builder.d.ts",
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"tslib": "^2.8.1"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import * as _masterteam_formula_builder from '@masterteam/formula-builder';
|
|
2
|
+
import * as _angular_core from '@angular/core';
|
|
3
|
+
import { OnDestroy } from '@angular/core';
|
|
4
|
+
import { ControlValueAccessor } from '@angular/forms';
|
|
5
|
+
import { RadioItem } from '@masterteam/components/radio-cards';
|
|
6
|
+
import { FunctionCategoryGroup, FormulaToken, ValidationResult, SmartBlock } from '@masterteam/components/formula';
|
|
7
|
+
export { ArgumentSlot, BlockType, DragBehavior, FormulaToken, FunctionCategoryGroup, FunctionDefinition, OperatorDefinition, SmartBlock, TokenType, ValidationError, ValidationResult, createFunctionBlock, createLiteralBlock, createOperatorBlock, createPropertyBlock } from '@masterteam/components/formula';
|
|
8
|
+
import { Observable } from 'rxjs';
|
|
9
|
+
|
|
10
|
+
/** Validation request payload (for API calls) */
|
|
11
|
+
interface ValidationRequest {
|
|
12
|
+
formula: string;
|
|
13
|
+
knownProperties?: string[];
|
|
14
|
+
levelSchemaId?: number;
|
|
15
|
+
templateId?: number;
|
|
16
|
+
}
|
|
17
|
+
/** Function catalog response from API */
|
|
18
|
+
interface FunctionCatalogResponse {
|
|
19
|
+
categories: FunctionCategoryGroup[];
|
|
20
|
+
}
|
|
21
|
+
/** API error response */
|
|
22
|
+
interface ApiErrorResponse {
|
|
23
|
+
error: string;
|
|
24
|
+
message?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface FormulaPropertyDescriptor {
|
|
28
|
+
key: string;
|
|
29
|
+
name?: string;
|
|
30
|
+
viewType?: string;
|
|
31
|
+
source?: string;
|
|
32
|
+
}
|
|
33
|
+
interface OperatorDescriptor {
|
|
34
|
+
token: string;
|
|
35
|
+
cardinality: 'scalar' | 'table';
|
|
36
|
+
requiresParameter: boolean;
|
|
37
|
+
parameterKind?: 'levelKey' | 'moduleKey' | string | null;
|
|
38
|
+
isTerminal: boolean;
|
|
39
|
+
example?: string;
|
|
40
|
+
description?: string;
|
|
41
|
+
}
|
|
42
|
+
interface NextTokenRule {
|
|
43
|
+
afterOperator?: string;
|
|
44
|
+
parameterKind: 'levelKey' | 'moduleKey';
|
|
45
|
+
allowedValues: string[];
|
|
46
|
+
}
|
|
47
|
+
interface FormulaEngineSchemaDescriptor {
|
|
48
|
+
schemaId: number;
|
|
49
|
+
operators: OperatorDescriptor[];
|
|
50
|
+
nextTokenRules: Record<string, NextTokenRule>;
|
|
51
|
+
version?: string;
|
|
52
|
+
generatedAt?: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
interface FormulaBuilderContextResponse {
|
|
56
|
+
schemaId: number;
|
|
57
|
+
contextEntityTypeKey?: string;
|
|
58
|
+
schemaDescriptor: FormulaEngineSchemaDescriptor;
|
|
59
|
+
currentProperties: FormulaPropertyDescriptor[];
|
|
60
|
+
functions?: FunctionCatalogResponse;
|
|
61
|
+
keywords?: string[];
|
|
62
|
+
}
|
|
63
|
+
interface FormulaBuilderNextTokensResponse {
|
|
64
|
+
schemaId: number;
|
|
65
|
+
component: string;
|
|
66
|
+
tablePath: string;
|
|
67
|
+
nextTokenRules: Record<string, NextTokenRule>;
|
|
68
|
+
version?: string;
|
|
69
|
+
generatedAt?: string;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
interface FormulaBuilderValue {
|
|
73
|
+
expression: string;
|
|
74
|
+
builder: FormulaToken[];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
type PathSegment = {
|
|
78
|
+
operatorToken: string;
|
|
79
|
+
value: string;
|
|
80
|
+
};
|
|
81
|
+
type SegmentMeta = PathSegment & {
|
|
82
|
+
parameterKind?: string | null;
|
|
83
|
+
requiresParameter: boolean;
|
|
84
|
+
allowedValues: string[];
|
|
85
|
+
optional: boolean;
|
|
86
|
+
canRemove: boolean;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
declare class FormulaBuilder implements ControlValueAccessor, OnDestroy {
|
|
90
|
+
private readonly validatorService;
|
|
91
|
+
private readonly contextService;
|
|
92
|
+
/** Reference to the formula editor */
|
|
93
|
+
private readonly editor;
|
|
94
|
+
/** Properties per table path (e.g., "Current", "Children.Project") */
|
|
95
|
+
readonly propertiesByPath: _angular_core.InputSignal<Record<string, {
|
|
96
|
+
key: string;
|
|
97
|
+
name?: string;
|
|
98
|
+
}[]>>;
|
|
99
|
+
/** Level schema ID for validation context */
|
|
100
|
+
readonly levelSchemaId: _angular_core.InputSignal<number | undefined>;
|
|
101
|
+
/** Template ID for validation context */
|
|
102
|
+
readonly templateId: _angular_core.InputSignal<number | undefined>;
|
|
103
|
+
/** Placeholder text */
|
|
104
|
+
readonly placeholder: _angular_core.InputSignal<string>;
|
|
105
|
+
/** Hide the top toolbar */
|
|
106
|
+
readonly hideToolbar: _angular_core.InputSignal<boolean>;
|
|
107
|
+
/** Hide the status bar */
|
|
108
|
+
readonly hideStatusBar: _angular_core.InputSignal<boolean>;
|
|
109
|
+
/** Emits validation result on change */
|
|
110
|
+
readonly validationChange: _angular_core.OutputEmitterRef<ValidationResult>;
|
|
111
|
+
/** Emits when tokens change */
|
|
112
|
+
readonly tokensChange: _angular_core.OutputEmitterRef<FormulaToken[]>;
|
|
113
|
+
/** Editor focus state */
|
|
114
|
+
readonly hasFocus: _angular_core.WritableSignal<boolean>;
|
|
115
|
+
/** Form control value */
|
|
116
|
+
private readonly expressionValue;
|
|
117
|
+
private readonly builderValue;
|
|
118
|
+
/** Tokens for the editor */
|
|
119
|
+
readonly tokens: _angular_core.WritableSignal<FormulaToken[]>;
|
|
120
|
+
/** Track last synced builder JSON to avoid loops */
|
|
121
|
+
private lastBuilderJson;
|
|
122
|
+
/** ControlValueAccessor callbacks */
|
|
123
|
+
private onChange;
|
|
124
|
+
private onTouched;
|
|
125
|
+
/** Disabled state */
|
|
126
|
+
private readonly isDisabled;
|
|
127
|
+
/** Validation result from service */
|
|
128
|
+
readonly validation: _angular_core.Signal<ValidationResult>;
|
|
129
|
+
/** Is validation in progress */
|
|
130
|
+
readonly isValidating: _angular_core.Signal<boolean>;
|
|
131
|
+
/** Builder context from API */
|
|
132
|
+
readonly builderContext: _angular_core.WritableSignal<FormulaBuilderContextResponse | null>;
|
|
133
|
+
/** Function categories from context */
|
|
134
|
+
readonly functionCategories: _angular_core.Signal<_masterteam_formula_builder.FunctionCategoryGroup[]>;
|
|
135
|
+
/** Is builder context loading */
|
|
136
|
+
readonly isContextLoading: _angular_core.WritableSignal<boolean>;
|
|
137
|
+
private contextRequestId;
|
|
138
|
+
/** Properties loaded from API */
|
|
139
|
+
private readonly propertiesByPathApi;
|
|
140
|
+
/** Current property list loading path */
|
|
141
|
+
private readonly propertyLoadingPath;
|
|
142
|
+
constructor();
|
|
143
|
+
ngOnDestroy(): void;
|
|
144
|
+
writeValue(value: FormulaBuilderValue | null): void;
|
|
145
|
+
registerOnChange(fn: (value: FormulaBuilderValue) => void): void;
|
|
146
|
+
registerOnTouched(fn: () => void): void;
|
|
147
|
+
setDisabledState(isDisabled: boolean): void;
|
|
148
|
+
/** Handle formula change from editor */
|
|
149
|
+
onFormulaChange(newFormula: string): void;
|
|
150
|
+
/** Handle block insert from toolbar */
|
|
151
|
+
onBlockInsert(block: SmartBlock): void;
|
|
152
|
+
/** Handle tokens change */
|
|
153
|
+
onTokensChange(newTokens: FormulaToken[]): void;
|
|
154
|
+
onEditorFocus(): void;
|
|
155
|
+
onEditorBlur(): void;
|
|
156
|
+
private emitValueChange;
|
|
157
|
+
/** Clear the formula */
|
|
158
|
+
clear(): void;
|
|
159
|
+
readonly propertyScope: _angular_core.WritableSignal<string>;
|
|
160
|
+
readonly propertyPathSegments: _angular_core.WritableSignal<PathSegment[]>;
|
|
161
|
+
readonly propertyFieldKey: _angular_core.WritableSignal<string>;
|
|
162
|
+
private readonly nextTokenRulesByPath;
|
|
163
|
+
readonly contextOperators: _angular_core.Signal<OperatorDescriptor[]>;
|
|
164
|
+
readonly baseOperator: _angular_core.Signal<OperatorDescriptor | undefined>;
|
|
165
|
+
readonly baseRule: _angular_core.Signal<NextTokenRule | undefined>;
|
|
166
|
+
readonly availableScopes: _angular_core.Signal<{
|
|
167
|
+
key: string;
|
|
168
|
+
label: string;
|
|
169
|
+
requiresParam: boolean;
|
|
170
|
+
optional: boolean;
|
|
171
|
+
}[]>;
|
|
172
|
+
/** Radio card options for scope selection */
|
|
173
|
+
readonly scopeOptions: _angular_core.Signal<RadioItem[]>;
|
|
174
|
+
/** Handle scope selection from radio cards */
|
|
175
|
+
onScopeChange(item: RadioItem): void;
|
|
176
|
+
readonly pathSegments: _angular_core.Signal<SegmentMeta[]>;
|
|
177
|
+
readonly isDirectAccess: _angular_core.Signal<boolean>;
|
|
178
|
+
readonly propertyTablePath: _angular_core.Signal<string>;
|
|
179
|
+
readonly resolvedTablePath: _angular_core.Signal<string>;
|
|
180
|
+
readonly currentNextTokenRules: _angular_core.Signal<Record<string, NextTokenRule>>;
|
|
181
|
+
readonly nextOperatorOptions: _angular_core.Signal<{
|
|
182
|
+
token: string;
|
|
183
|
+
rule: NextTokenRule;
|
|
184
|
+
requiresParameter: boolean;
|
|
185
|
+
allowedValues: string[];
|
|
186
|
+
}[]>;
|
|
187
|
+
readonly canAddNextSegment: _angular_core.Signal<boolean>;
|
|
188
|
+
readonly propertiesComponent: _angular_core.Signal<string | undefined>;
|
|
189
|
+
readonly mergedPropertiesByPath: _angular_core.Signal<Record<string, FormulaPropertyDescriptor[]>>;
|
|
190
|
+
readonly isPropertyLoading: _angular_core.Signal<boolean>;
|
|
191
|
+
readonly propertyOptions: _angular_core.Signal<{
|
|
192
|
+
key: string;
|
|
193
|
+
name: string;
|
|
194
|
+
}[]>;
|
|
195
|
+
readonly selectedProperty: _angular_core.Signal<{
|
|
196
|
+
key: string;
|
|
197
|
+
name: string;
|
|
198
|
+
} | null>;
|
|
199
|
+
readonly canInsertProperty: _angular_core.Signal<boolean>;
|
|
200
|
+
setPropertyScope(scope: string): void;
|
|
201
|
+
setPathSegmentValue(index: number, value: string | null): void;
|
|
202
|
+
addNextSegment(operatorToken: string): void;
|
|
203
|
+
onAddSegmentSelection(operatorToken: string, popover: {
|
|
204
|
+
hide: () => void;
|
|
205
|
+
}): void;
|
|
206
|
+
removePathSegment(index: number): void;
|
|
207
|
+
segmentOptions(index: number): {
|
|
208
|
+
key: string;
|
|
209
|
+
name: string;
|
|
210
|
+
}[];
|
|
211
|
+
insertSelectedProperty(insertBlock: (block: SmartBlock) => void): void;
|
|
212
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormulaBuilder, never>;
|
|
213
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormulaBuilder, "mt-formula-builder", never, { "propertiesByPath": { "alias": "propertiesByPath"; "required": false; "isSignal": true; }; "levelSchemaId": { "alias": "levelSchemaId"; "required": false; "isSignal": true; }; "templateId": { "alias": "templateId"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "hideToolbar": { "alias": "hideToolbar"; "required": false; "isSignal": true; }; "hideStatusBar": { "alias": "hideStatusBar"; "required": false; "isSignal": true; }; }, { "validationChange": "validationChange"; "tokensChange": "tokensChange"; }, never, never, true, never>;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
declare class FormulaContextService {
|
|
217
|
+
private readonly http;
|
|
218
|
+
private readonly apiUrl;
|
|
219
|
+
private readonly contextCache;
|
|
220
|
+
private readonly propertiesCache;
|
|
221
|
+
private readonly nextTokensCache;
|
|
222
|
+
loadContext(schemaId: number, contextEntityTypeKey?: string): Observable<FormulaBuilderContextResponse | null>;
|
|
223
|
+
getScopeProperties(schemaId: number, component: string, tablePath: string): Observable<FormulaPropertyDescriptor[]>;
|
|
224
|
+
getNextTokens(schemaId: number, component: string, tablePath: string): Observable<FormulaBuilderNextTokensResponse | null>;
|
|
225
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormulaContextService, never>;
|
|
226
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<FormulaContextService>;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
declare class FormulaValidatorService {
|
|
230
|
+
private readonly http;
|
|
231
|
+
private readonly apiUrl;
|
|
232
|
+
/** Debounce time in ms */
|
|
233
|
+
private readonly DEBOUNCE_MS;
|
|
234
|
+
/** Current validation result */
|
|
235
|
+
private readonly _validation;
|
|
236
|
+
/** Loading state */
|
|
237
|
+
private readonly _isValidating;
|
|
238
|
+
/** Validation subject for debouncing */
|
|
239
|
+
private readonly validateSubject;
|
|
240
|
+
/** Public signals */
|
|
241
|
+
readonly validation: _angular_core.Signal<ValidationResult>;
|
|
242
|
+
readonly isValidating: _angular_core.Signal<boolean>;
|
|
243
|
+
constructor();
|
|
244
|
+
/** Setup debounced validation stream */
|
|
245
|
+
private setupValidationStream;
|
|
246
|
+
/** Validate formula (debounced) */
|
|
247
|
+
validate(formula: string, knownProperties?: string[], levelSchemaId?: number, templateId?: number): void;
|
|
248
|
+
/** Validate formula immediately (no debounce) */
|
|
249
|
+
validateImmediate(formula: string, knownProperties?: string[], levelSchemaId?: number, templateId?: number): Observable<ValidationResult>;
|
|
250
|
+
/** Call validation API */
|
|
251
|
+
private callValidateApi;
|
|
252
|
+
/** Reset validation state */
|
|
253
|
+
reset(): void;
|
|
254
|
+
/** Get current validation result */
|
|
255
|
+
getCurrentValidation(): ValidationResult;
|
|
256
|
+
/** Check if formula is valid */
|
|
257
|
+
isValid(): boolean;
|
|
258
|
+
/** Get validation errors */
|
|
259
|
+
getErrors(): _masterteam_formula_builder.ValidationError[];
|
|
260
|
+
/** Get validation warnings */
|
|
261
|
+
getWarnings(): _masterteam_formula_builder.ValidationError[];
|
|
262
|
+
/** Get formula dependencies */
|
|
263
|
+
getDependencies(): string[];
|
|
264
|
+
/** Get formula complexity */
|
|
265
|
+
getComplexity(): number;
|
|
266
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormulaValidatorService, never>;
|
|
267
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<FormulaValidatorService>;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export { FormulaBuilder, FormulaContextService, FormulaValidatorService };
|
|
271
|
+
export type { ApiErrorResponse, FormulaBuilderContextResponse, FormulaBuilderValue, FormulaEngineSchemaDescriptor, FormulaPropertyDescriptor, FunctionCatalogResponse, NextTokenRule, OperatorDescriptor, ValidationRequest };
|