@finos/legend-extension-dsl-data-quality
Version:
Legend extension for Data Quality
127 lines • 10.6 kB
JavaScript
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