@finos/legend-extension-dsl-data-quality
Version:
Legend extension for Data Quality
83 lines • 7.07 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
/**
* Copyright (c) 2020-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 { useCallback, useRef } from 'react';
import { observer } from 'mobx-react-lite';
import { FilledWindowMaximizeIcon, PanelDnDEntry, PanelEntryDragHandle, RocketIcon, TimesIcon, useDragPreviewLayer, clsx, } from '@finos/legend-art';
import { flowResult } from 'mobx';
import { PrimitiveType } from '@finos/legend-graph';
import { ApplicationNavigationContextData, useApplicationStore, } from '@finos/legend-application';
import { InlineLambdaEditor } from '@finos/legend-query-builder';
import { DATA_QUALITY_RELATION_VALIDATION_EDITOR_TAB, } from './states/DataQualityRelationValidationConfigurationState.js';
import { dataQualityRelationValidation_setDescription, dataQualityRelationValidation_setName, dataQualityRelationValidation_swapValidations, } from '../graph-manager/DSL_DataQuality_GraphModifierHelper.js';
import { DataQualityValidationDetailPanel } from './DataQualityValidationDetailPanel.js';
import { useDrag, useDrop } from 'react-dnd';
import { DSL_DATA_QUALITY_LEGEND_STUDIO_APPLICATION_NAVIGATION_CONTEXT_KEY } from '../__lib__/studio/DSL_DataQuality_LegendStudioApplicationNavigationContext.js';
export const RELATION_VALIDATION_DND_TYPE = 'RELATION_VALIDATION';
export const DataQualityRelationValidationEditor = observer((props) => {
const ref = useRef(null);
const handleRef = useRef(null);
const { validation, deleteValidation, relationValidationConfigurationState, isReadOnly, } = props;
const applicationStore = useApplicationStore();
const hasParserError = relationValidationConfigurationState.validationStates.some((state) => Boolean(state.parserError));
const validationState = relationValidationConfigurationState.getValidationState(validation);
const changeName = (event) => dataQualityRelationValidation_setName(validation, event.target.value);
const changeDescription = (event) => dataQualityRelationValidation_setDescription(validation, event.target.value);
const handleHover = useCallback((item) => {
const draggingProperty = item.validation;
const hoveredProperty = validation;
dataQualityRelationValidation_swapValidations(relationValidationConfigurationState.validationElement, draggingProperty, hoveredProperty);
}, [relationValidationConfigurationState.validationElement, validation]);
const [{ isBeingDraggedValidation }, dropConnector] = useDrop(() => ({
accept: [RELATION_VALIDATION_DND_TYPE],
hover: (item) => handleHover(item),
collect: (monitor) => ({
isBeingDraggedValidation: monitor.getItem()?.validation,
}),
}), [handleHover]);
const isBeingDragged = validation === isBeingDraggedValidation;
const [, dragConnector, dragPreviewConnector] = useDrag(() => ({
type: RELATION_VALIDATION_DND_TYPE,
item: () => ({
validation: validation,
}),
}), [validation]);
dragConnector(handleRef);
dropConnector(ref);
useDragPreviewLayer(dragPreviewConnector);
// Actions
const onLambdaEditorFocus = (isAssertion) => applicationStore.navigationContextService.push(ApplicationNavigationContextData.createTransient(DSL_DATA_QUALITY_LEGEND_STUDIO_APPLICATION_NAVIGATION_CONTEXT_KEY.VALIDATION_ASSERTION_EDITOR));
const remove = applicationStore.guardUnhandledError(async () => {
await flowResult(validationState.convertLambdaObjectToGrammarString({ pretty: false }));
deleteValidation();
});
const runQuery = () => {
relationValidationConfigurationState.setSelectedTab(DATA_QUALITY_RELATION_VALIDATION_EDITOR_TAB.TRIAL_RUN);
if (!relationValidationConfigurationState.resultState.isRunningValidation) {
relationValidationConfigurationState.resetResultState();
relationValidationConfigurationState.resultState.setValidationToRun(validation);
relationValidationConfigurationState.resultState.handleRunValidation();
}
};
const openValidationDialog = () => {
validationState.setIsValidationDialogOpen(true);
};
return (_jsxs(PanelDnDEntry, { ref: ref, placeholder: _jsx("div", { className: "uml-element-editor__dnd__placeholder" }), className: "relation-validation__container", showPlaceholder: isBeingDragged, children: [_jsxs("div", { className: clsx('relation-validation', {
backdrop__element: validationState.parserError,
}), children: [_jsxs("div", { className: "relation-validation__content", children: [_jsx(PanelEntryDragHandle, { dragSourceConnector: handleRef, isDragging: isBeingDragged }), _jsx("input", { className: "relation-validation__content__name", spellCheck: false, disabled: isReadOnly, value: validation.name, onChange: changeName, placeholder: "Validation name" }), !isReadOnly && (_jsx("button", { className: "uml-element-editor__remove-btn", onClick: remove, tabIndex: -1, title: "Remove", children: _jsx(TimesIcon, {}) })), _jsx("button", { className: "uml-element-editor__remove-btn", onClick: runQuery, tabIndex: -1, title: "Run Validation", disabled: hasParserError, children: _jsx(RocketIcon, {}) }), _jsx("button", { className: "uml-element-editor__remove-btn", onClick: openValidationDialog, tabIndex: -1, title: "Open Validation Details dialog", children: _jsx(FilledWindowMaximizeIcon, {}) })] }), _jsxs("div", { className: "data-quality-uml-element-editor__lambda", children: [_jsx("div", { className: "data-quality-uml-element-editor__lambda__label", children: "Assertion" }), _jsx("div", { className: "data-quality-uml-element-editor__lambda__value", children: _jsx(InlineLambdaEditor, { disabled: relationValidationConfigurationState.isConvertingValidationLambdaObjects ||
isReadOnly, lambdaEditorState: validationState, forceBackdrop: hasParserError, expectedType: PrimitiveType.BOOLEAN, onEditorFocus: () => onLambdaEditorFocus(true), disablePopUp: true, className: "relation-validation__lambda" }) })] })] }), validationState.isValidationDialogOpen && (_jsx(DataQualityValidationDetailPanel, { dataQualityRelationValidationState: relationValidationConfigurationState, isReadOnly: isReadOnly, relationValidationState: validationState, changeName: changeName, changeDescription: changeDescription, onLambdaEditorFocus: onLambdaEditorFocus, forceBackdrop: hasParserError }))] }));
});
//# sourceMappingURL=DataQualityRelationValidationEditor.js.map