UNPKG

@finos/legend-extension-dsl-data-quality

Version:
127 lines 10.6 kB
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; /** * Copyright (c) 2026-present, Goldman Sachs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { observer } from 'mobx-react-lite'; import { PropertyExplicitReference, } from '@finos/legend-graph'; import { DataQualityValidationFilterCondition, DataQualityValidationLogicalGroupFunction, DataQualityValidationPropertyGuarantee, } from './utils/DataQualityValidationFunction.js'; import { DataQualityValidationFunctionRenderer } from './DataQualityValidationFunctionRenderer.js'; import { DataQualityValidationFunctionsUtils } from './utils/DataQualityValidationFunctionsUtils.js'; import { propertyExpression_setFunc } from '@finos/legend-query-builder'; import { ControlledDropdownMenu, MenuContent, MenuContentItem, PlusIcon, TrashIcon, } from '@finos/legend-art'; import { dataQualityValidationFilterFunction_addLogicalOperation, dataQualityValidationFilterFunction_deleteCondition, dataQualityValidationFilterFunction_transformConditionToLogicalGroup, dataQualityValidationLogicalGroupFunction_changeGroupFunction, } from './utils/DataQualityValidationFunctionModifier.js'; import { DataQualityValidationFunctionFactory } from './utils/DataQualityValidationFunctionFactory.js'; import { DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS } from './constants/DataQualityConstants.js'; import { useRef } from 'react'; const DataQualityValidationFilterConditionEditor = observer((props) => { const { condition, validationState, disabled, showAddButton, showDeleteButton, handleFunctionChange, onAdd, onDelete, getFunctionOptions, handleColumnChange, handleFunctionParamChange, } = props; const functionParamsRef = useRef([]); const { columnOptions } = validationState; const observerContext = validationState.editorStore.changeDetectionState.observerContext; const graph = validationState.editorStore.graphManagerState.graph; const column = condition.parameters.property instanceof DataQualityValidationPropertyGuarantee ? condition.parameters.property.parameters.property : condition.parameters.property; const columnOption = columnOptions.find(({ value }) => value === column.func.value.name); return (_jsxs("div", { className: "data-quality-validation-gui-editor__filter-validation", children: [_jsx(DataQualityValidationFunctionRenderer, { id: condition.id, columnOptions: columnOptions, graph: graph, observerContext: observerContext, readOnly: disabled, functionName: condition.name, functionParameters: condition.parameters.otherParams, functionOptions: getFunctionOptions(columnOption?.type ?? ''), handleColChange: (value) => { propertyExpression_setFunc(column, PropertyExplicitReference.create({ name: value, })); handleColumnChange(value); }, selectedColumn: columnOption, handleFunctionChange: (name, id) => { handleFunctionChange(name, id, columnOption?.isOptional ?? false); }, handleFunctionParametersChange: (param, index) => { condition.parameters.otherParams[index] = param; functionParamsRef.current = [param, index]; }, onInputBlur: () => { if (functionParamsRef.current.length === 2) { handleFunctionParamChange(...functionParamsRef.current); } } }), showAddButton && (_jsx(ControlledDropdownMenu, { className: "data-quality-validation-gui-editor__filter-validation__add-condition", title: "Add Condition", content: _jsxs(MenuContent, { children: [_jsx(MenuContentItem, { onClick: () => onAdd?.(DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS.AND, columnOption?.isOptional ?? false), children: "And" }), _jsx(MenuContentItem, { onClick: () => { onAdd?.(DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS.OR, columnOption?.isOptional ?? false); }, children: "Or" })] }), children: _jsx(PlusIcon, { size: 10, color: "white" }) })), showDeleteButton && (_jsx("button", { className: "data-quality-validation-gui-editor__filter-validation__add-condition", title: "Add Condition", onClick: onDelete, children: _jsx(TrashIcon, { size: 10, color: "white" }) }))] })); }); const RenderConditionTree = observer((props) => { const { condition, validationState, disabled, validationFunction } = props; const observerContext = validationState.editorStore.changeDetectionState.observerContext; const graph = validationState.editorStore.graphManagerState.graph; const functionFactory = new DataQualityValidationFunctionFactory(graph, observerContext); if (condition instanceof DataQualityValidationLogicalGroupFunction) { return (_jsxs("div", { className: "data-quality-validation-gui-editor__logical-group", children: [_jsx("div", { className: "data-quality-validation-gui-editor__logical-group__branch", children: _jsx(RenderConditionTree, { condition: condition.parameters.left, validationState: validationState, disabled: disabled, validationFunction: validationFunction }) }), _jsx("button", { className: "data-quality-validation-gui-editor__logical-group__operator", title: "Switch operator", onClick: () => { condition.changeName(); validationState.debouncedHandleValidationFormChange(); }, children: condition.name.toUpperCase() }), _jsx("div", { className: "data-quality-validation-gui-editor__logical-group__branch", children: _jsx(RenderConditionTree, { condition: condition.parameters.right, validationState: validationState, disabled: disabled, validationFunction: validationFunction }) })] })); } const handleFunctionChange = (name, id, isCurrentColOptional) => { const findAndChange = (node, parent, isLeftChild) => { if (node.id === id) { if (parent) { dataQualityValidationLogicalGroupFunction_changeGroupFunction(parent, name, isLeftChild ? 'left' : 'right', functionFactory, observerContext, isCurrentColOptional); return true; } // If no parent, this is the root - handle separately return false; } if (node instanceof DataQualityValidationLogicalGroupFunction) { return (findAndChange(node.parameters.left, node, true) || findAndChange(node.parameters.right, node, false)); } return false; }; findAndChange(validationFunction.parameters.lambda.body); validationState.debouncedHandleValidationFormChange(); }; if (condition instanceof DataQualityValidationFilterCondition) { return (_jsx(DataQualityValidationFilterConditionEditor, { condition: condition, validationState: validationState, disabled: disabled, showAddButton: true, showDeleteButton: true, getFunctionOptions: (type) => DataQualityValidationFunctionsUtils.getFilterFunctionOptionsByColType(type), handleFunctionChange: handleFunctionChange, onDelete: () => { dataQualityValidationFilterFunction_deleteCondition(validationFunction, condition); validationState.debouncedHandleValidationFormChange(); }, onAdd: (newOperator, isCurrentColOptional) => { dataQualityValidationFilterFunction_transformConditionToLogicalGroup(validationFunction, condition, newOperator, functionFactory, observerContext, isCurrentColOptional); validationState.debouncedHandleValidationFormChange(); }, handleColumnChange: () => { validationState.debouncedHandleValidationFormChange(); }, handleFunctionParamChange: () => { validationState.debouncedHandleValidationFormChange(); } })); } return null; }); export const DataQualityValidationFilterEditor = observer((props) => { const { validationState, validationFunction, disabled } = props; const { dataQualityValidationLambdaFormState } = validationState; const observerContext = validationState.editorStore.changeDetectionState.observerContext; const graph = validationState.editorStore.graphManagerState.graph; const functionFactory = new DataQualityValidationFunctionFactory(graph, observerContext); if (!dataQualityValidationLambdaFormState) { return null; } const { handleValidationBodyChange } = dataQualityValidationLambdaFormState; const { body } = validationFunction.parameters.lambda; if (body instanceof DataQualityValidationFilterCondition) { return (_jsx(DataQualityValidationFilterConditionEditor, { condition: body, validationState: validationState, disabled: disabled, showAddButton: !!body.name, showDeleteButton: false, getFunctionOptions: (type) => DataQualityValidationFunctionsUtils.getFunctionOptionsByColType(type), handleFunctionChange: (name, _, isCurrentColOptional) => { handleValidationBodyChange(name, isCurrentColOptional); validationState.debouncedHandleValidationFormChange(); }, onAdd: (operator, isCurrentColOptional) => { dataQualityValidationFilterFunction_addLogicalOperation(validationFunction, body, operator, functionFactory, observerContext, isCurrentColOptional); }, handleColumnChange: () => { validationState.debouncedHandleValidationFormChange(); }, handleFunctionParamChange: () => { validationState.debouncedHandleValidationFormChange(); } })); } return (_jsx("div", { className: "data-quality-validation-gui-editor__filter-validation", children: _jsx("div", { className: "data-quality-validation-gui-editor__filter-validation__body", children: _jsx(RenderConditionTree, { condition: body, validationState: validationState, disabled: disabled, validationFunction: validationFunction }) }) })); }); //# sourceMappingURL=DataQualityValidationFilterEditor.js.map