This is an automated email from the ASF dual-hosted git repository.
tiagobento pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools.git
The following commit(s) were added to refs/heads/main by this push:
new fe9f5709599 kie-issues#1019: React-Based DMN Editor: allowedValues not
allowed for custom type (#2274)
fe9f5709599 is described below
commit fe9f5709599ad7f720725477ea3b90e31bede638
Author: Luiz João Motta <[email protected]>
AuthorDate: Fri May 3 09:57:58 2024 -0300
kie-issues#1019: React-Based DMN Editor: allowedValues not allowed for
custom type (#2274)
---
packages/dmn-editor/src/dataTypes/Constraints.tsx | 481 +++++++++++++--------
.../dmn-editor/src/dataTypes/ConstraintsEnum.tsx | 3 +-
.../src/dataTypes/ConstraintsExpression.tsx | 45 +-
.../dmn-editor/src/dataTypes/ConstraintsRange.tsx | 3 +-
.../dmn-editor/src/dataTypes/DataTypePanel.tsx | 1 +
packages/dmn-editor/src/dataTypes/DataTypes.tsx | 2 +-
.../src/dataTypes/ItemComponentsTable.tsx | 34 +-
.../dmn-editor/src/dataTypes/TypeRefSelector.tsx | 35 +-
.../Fields.tsx | 2 +-
9 files changed, 393 insertions(+), 213 deletions(-)
diff --git a/packages/dmn-editor/src/dataTypes/Constraints.tsx
b/packages/dmn-editor/src/dataTypes/Constraints.tsx
index 812bb9c801d..9a2b93230af 100644
--- a/packages/dmn-editor/src/dataTypes/Constraints.tsx
+++ b/packages/dmn-editor/src/dataTypes/Constraints.tsx
@@ -18,7 +18,7 @@
*/
import * as React from "react";
-import { useMemo, useCallback } from "react";
+import { useMemo, useCallback, useState, useEffect } from "react";
import { ConstraintsExpression } from "./ConstraintsExpression";
import {
DMN15__tItemDefinition,
@@ -28,9 +28,9 @@ import { DmnBuiltInDataType, generateUuid } from
"@kie-tools/boxed-expression-co
import { ConstraintsEnum, isEnum } from "./ConstraintsEnum";
import { ConstraintsRange, isRange } from "./ConstraintsRange";
import { KIE__tConstraintType } from
"@kie-tools/dmn-marshaller/dist/schemas/kie-1_0/ts-gen/types";
-import { EditItemDefinition } from "./DataTypes";
+import { DataTypeIndex, EditItemDefinition } from "./DataTypes";
import { ToggleGroup, ToggleGroupItem } from
"@patternfly/react-core/dist/js/components/ToggleGroup";
-import { constrainableBuiltInFeelTypes } from "./DataTypeSpec";
+import { constrainableBuiltInFeelTypes, isCollection, isStruct } from
"./DataTypeSpec";
import moment from "moment";
import { TextInput } from
"@patternfly/react-core/dist/js/components/TextInput";
import { ConstraintDate } from "./ConstraintComponents/ConstraintDate";
@@ -46,6 +46,10 @@ import {
} from "./ConstraintComponents/ConstraintYearsMonthsDuration";
import { invalidInlineFeelNameStyle } from "../feel/InlineFeelNameInput";
import { ConstraintProps } from "./ConstraintComponents/Constraint";
+import { useDmnEditorStore } from "../store/StoreContext";
+import { useExternalModels } from
"../includedModels/DmnEditorDependenciesContext";
+import { UniqueNameIndex } from
"@kie-tools/dmn-marshaller/dist/schemas/dmn-1_5/Dmn15Spec";
+import { builtInFeelTypeNames } from "./BuiltInFeelTypes";
export type TypeHelper = {
check: (value: string) => boolean;
@@ -56,6 +60,7 @@ export type TypeHelper = {
};
export interface ConstraintComponentProps {
+ id: string;
isReadonly: boolean;
value?: string;
expressionValue?: string;
@@ -73,31 +78,71 @@ enum ConstraintsType {
NONE = "None",
}
-export const constraintTypeHelper = (typeRef: DmnBuiltInDataType): TypeHelper
=> {
- return {
+// Recurse the `itemDefinition` until find `typeRef` attribute
+// that is part of the built in FEEL types.
+// If the found `itemDefinition` is a collection, it will have a early stop.
+export function recursivelyGetRootItemDefinition(
+ itemDefinition: DMN15__tItemDefinition,
+ allDataTypesById: DataTypeIndex,
+ allTopLevelItemDefinitionUniqueNames: UniqueNameIndex
+): DMN15__tItemDefinition {
+ const typeRef: DmnBuiltInDataType =
+ (itemDefinition.typeRef?.__$$text as DmnBuiltInDataType) ??
DmnBuiltInDataType.Undefined;
+
+ if (builtInFeelTypeNames.has(typeRef) === false) {
+ const parentDataType =
allDataTypesById.get(allTopLevelItemDefinitionUniqueNames.get(typeRef) ?? "");
+ if (parentDataType !== undefined &&
isCollection(parentDataType.itemDefinition)) {
+ // Parent `itemDefinition` is a collection. Early stop.
+ return parentDataType.itemDefinition;
+ } else if (parentDataType !== undefined) {
+ return recursivelyGetRootItemDefinition(
+ parentDataType.itemDefinition,
+ allDataTypesById,
+ allTopLevelItemDefinitionUniqueNames
+ );
+ }
+ // Something wrong. Caller `itemDefinition` isn't a built-in FEEL type and
doesn't have parent.
+ return itemDefinition;
+ }
+ // Caller `itemDefinition` is a built-in FEEL type
+ return itemDefinition;
+}
+
+export const constraintTypeHelper = (
+ itemDefinition: DMN15__tItemDefinition,
+ allDataTypesById?: DataTypeIndex,
+ allTopLevelItemDefinitionUniqueNames?: UniqueNameIndex
+): TypeHelper => {
+ const typeRef =
+ (allDataTypesById !== undefined && allTopLevelItemDefinitionUniqueNames
!== undefined
+ ? recursivelyGetRootItemDefinition(itemDefinition, allDataTypesById,
allTopLevelItemDefinitionUniqueNames).typeRef
+ ?.__$$text
+ : itemDefinition.typeRef?.__$$text) ?? DmnBuiltInDataType.Undefined;
+
+ const typeHelper = {
// check if the value has the correct type
- check: (value: string) => {
- const recoveredValue = constraintTypeHelper(typeRef).recover(value);
- switch (typeRef) {
+ check: (value: string, type?: DmnBuiltInDataType) => {
+ const recoveredValue = typeHelper.recover(value);
+ switch (type ?? typeRef) {
case DmnBuiltInDataType.Any:
return true;
case DmnBuiltInDataType.String:
if (recoveredValue === "") {
return true;
}
- if (constraintTypeHelper(DmnBuiltInDataType.Date).check(value)) {
+ if (typeHelper.check(value, DmnBuiltInDataType.Date)) {
return false;
}
- if (constraintTypeHelper(DmnBuiltInDataType.DateTime).check(value)) {
+ if (typeHelper.check(value, DmnBuiltInDataType.DateTime)) {
return false;
}
- if
(constraintTypeHelper(DmnBuiltInDataType.DateTimeDuration).check(value)) {
+ if (typeHelper.check(value, DmnBuiltInDataType.DateTimeDuration)) {
return false;
}
- if (constraintTypeHelper(DmnBuiltInDataType.Time).check(value)) {
+ if (typeHelper.check(value, DmnBuiltInDataType.Time)) {
return false;
}
- if
(constraintTypeHelper(DmnBuiltInDataType.YearsMonthsDuration).check(value)) {
+ if (typeHelper.check(value, DmnBuiltInDataType.YearsMonthsDuration))
{
return false;
}
return typeof recoveredValue === "string";
@@ -125,7 +170,7 @@ export const constraintTypeHelper = (typeRef:
DmnBuiltInDataType): TypeHelper =>
// parse the value to the type
// useful for comparisons
parse: (value: string) => {
- const recoveredValue = constraintTypeHelper(typeRef).recover(value);
+ const recoveredValue = typeHelper.recover(value);
switch (typeRef) {
case DmnBuiltInDataType.Number:
return parseFloat(recoveredValue ?? "");
@@ -163,7 +208,7 @@ export const constraintTypeHelper = (typeRef:
DmnBuiltInDataType): TypeHelper =>
}
},
// recover the value before use it
- recover: (value?: string) => {
+ recover: (value: string | undefined) => {
if (value === undefined) {
return undefined;
}
@@ -248,41 +293,39 @@ export const constraintTypeHelper = (typeRef:
DmnBuiltInDataType): TypeHelper =>
}
},
};
+ return typeHelper;
};
export function useConstraint({
constraint,
itemDefinition,
- isCollectionConstraintEnable,
+ isCollectionConstraintEnabled,
+ constraintTypeHelper,
+ enabledConstraints,
}: {
constraint: DMN15__tUnaryTests | undefined;
itemDefinition: DMN15__tItemDefinition;
- isCollectionConstraintEnable: boolean;
+ isCollectionConstraintEnabled: boolean;
+ constraintTypeHelper: TypeHelper;
+ enabledConstraints: KIE__tConstraintType[] | undefined;
}) {
- const constraintValue = useMemo(() => constraint?.text.__$$text,
[constraint?.text.__$$text]);
- const kieConstraintType = useMemo(() =>
constraint?.["@_kie:constraintType"], [constraint]);
- const isCollection = useMemo(() => itemDefinition["@_isCollection"] ??
false, [itemDefinition]);
- const itemDefinitionId = useMemo(() => itemDefinition["@_id"],
[itemDefinition]);
-
- const typeRef: DmnBuiltInDataType = useMemo(
- () => (itemDefinition?.typeRef?.__$$text as DmnBuiltInDataType) ??
DmnBuiltInDataType.Undefined,
- [itemDefinition?.typeRef?.__$$text]
- );
+ const constraintValue = constraint?.text.__$$text;
+ const kieConstraintType = constraint?.["@_kie:constraintType"];
const isConstraintEnum = useMemo(
() =>
- isCollection === true && isCollectionConstraintEnable === true //
collection doesn't support enumeration constraint
+ isCollection(itemDefinition) === true && isCollectionConstraintEnabled
=== true // collection doesn't support enumeration constraint
? undefined
- : isEnum(constraintValue, constraintTypeHelper(typeRef).check),
- [constraintValue, isCollectionConstraintEnable, isCollection, typeRef]
+ : isEnum(constraintValue, constraintTypeHelper.check),
+ [constraintTypeHelper.check, constraintValue,
isCollectionConstraintEnabled, itemDefinition]
);
const isConstraintRange = useMemo(
() =>
- isCollection === true && isCollectionConstraintEnable === true //
collection doesn't support range constraint
+ isCollection(itemDefinition) === true && isCollectionConstraintEnabled
=== true // collection doesn't support range constraint
? undefined
- : isRange(constraintValue, constraintTypeHelper(typeRef).check),
- [constraintValue, isCollectionConstraintEnable, isCollection, typeRef]
+ : isRange(constraintValue, constraintTypeHelper.check),
+ [constraintTypeHelper.check, constraintValue,
isCollectionConstraintEnabled, itemDefinition]
);
const enumToKieConstraintType: (selection: ConstraintsType) =>
KIE__tConstraintType | undefined = useCallback(
@@ -303,21 +346,20 @@ export function useConstraint({
);
const isConstraintEnabled = useMemo(() => {
- const enabledConstraints = constrainableBuiltInFeelTypes.get(typeRef);
return {
enumeration:
- !(isCollection === true && isCollectionConstraintEnable === true) &&
+ !(isCollection(itemDefinition) === true &&
isCollectionConstraintEnabled === true) &&
(enabledConstraints ??
[]).includes(enumToKieConstraintType(ConstraintsType.ENUMERATION)!),
range:
- !(isCollection === true && isCollectionConstraintEnable === true) &&
+ !(isCollection(itemDefinition) === true &&
isCollectionConstraintEnabled === true) &&
(enabledConstraints ??
[]).includes(enumToKieConstraintType(ConstraintsType.RANGE)!),
expression:
- (isCollection === true && isCollectionConstraintEnable === true) ||
+ (isCollection(itemDefinition) === true &&
isCollectionConstraintEnabled === true) ||
(enabledConstraints ??
[]).includes(enumToKieConstraintType(ConstraintsType.EXPRESSION)!),
};
- }, [typeRef, isCollection, isCollectionConstraintEnable,
enumToKieConstraintType]);
+ }, [enabledConstraints, enumToKieConstraintType,
isCollectionConstraintEnabled, itemDefinition]);
- const selectedConstraint = useMemo<ConstraintsType>(() => {
+ const selectedKieConstraintType = useMemo(() => {
if (isConstraintEnabled.enumeration && kieConstraintType ===
"enumeration") {
return ConstraintsType.ENUMERATION;
}
@@ -347,27 +389,14 @@ export function useConstraint({
kieConstraintType,
]);
- return useMemo(() => {
- return {
- constraintValue,
- typeRef,
- isConstraintEnum,
- isConstraintRange,
- isConstraintEnabled,
- itemDefinitionId,
- selectedConstraint,
- enumToKieConstraintType,
- };
- }, [
+ return {
constraintValue,
- isConstraintEnabled,
isConstraintEnum,
isConstraintRange,
- itemDefinitionId,
- selectedConstraint,
- typeRef,
+ isConstraintEnabled,
+ selectedKieConstraintType,
enumToKieConstraintType,
- ]);
+ };
}
export function ConstraintsFromAllowedValuesAttribute({
@@ -383,100 +412,127 @@ export function ConstraintsFromAllowedValuesAttribute({
isEnumDisabled?: boolean;
isRangeDisabled?: boolean;
}) {
+ const { externalModelsByNamespace } = useExternalModels();
+ const allDataTypesById = useDmnEditorStore(
+ (s) =>
s.computed(s).getDataTypes(externalModelsByNamespace).allDataTypesById
+ );
+ const allTopLevelItemDefinitionUniqueNames = useDmnEditorStore(
+ (s) =>
s.computed(s).getDataTypes(externalModelsByNamespace).allTopLevelItemDefinitionUniqueNames
+ );
+
const allowedValues = useMemo(() => itemDefinition?.allowedValues,
[itemDefinition?.allowedValues]);
+ const itemDefinitionId = itemDefinition["@_id"]!;
+ const typeRef = (itemDefinition?.typeRef?.__$$text as DmnBuiltInDataType) ??
DmnBuiltInDataType.Undefined;
+ const typeRefConstraintTypeHelper = useMemo(
+ () => constraintTypeHelper(itemDefinition, allDataTypesById,
allTopLevelItemDefinitionUniqueNames),
+ [allDataTypesById, allTopLevelItemDefinitionUniqueNames, itemDefinition]
+ );
+
+ const rootItemDefinition = useMemo(
+ () => recursivelyGetRootItemDefinition(itemDefinition, allDataTypesById,
allTopLevelItemDefinitionUniqueNames),
+ [allDataTypesById, allTopLevelItemDefinitionUniqueNames, itemDefinition]
+ );
+
+ const enabledConstraints = useMemo(
+ () =>
+ isStruct(rootItemDefinition)
+ ? (["expression"] as KIE__tConstraintType[])
+ : constrainableBuiltInFeelTypes.get(
+ (rootItemDefinition.typeRef?.__$$text as DmnBuiltInDataType) ??
DmnBuiltInDataType.Undefined
+ ),
+ [rootItemDefinition]
+ );
+
+ // Collection constraint on the `allowedValues` must be enabled on cases
where `rootItemDefinition` is a collection
+ const isCollectionConstraintEnable = useMemo(() => {
+ if (itemDefinitionId !== rootItemDefinition["@_id"]) {
+ return rootItemDefinition["@_isCollection"] ?? false;
+ }
+ return false;
+ }, [itemDefinitionId, rootItemDefinition]);
const {
constraintValue,
- typeRef,
isConstraintEnum,
isConstraintRange,
isConstraintEnabled,
- itemDefinitionId,
- selectedConstraint,
+ selectedKieConstraintType,
enumToKieConstraintType,
} = useConstraint({
constraint: allowedValues,
itemDefinition,
- isCollectionConstraintEnable: false, // allowedValues doesn't support
constraint to the collection itself
+ isCollectionConstraintEnabled: isCollectionConstraintEnable,
+ constraintTypeHelper: typeRefConstraintTypeHelper,
+ enabledConstraints,
});
const onConstraintChange = useCallback(
- (value?: string) => {
- editItemDefinition(itemDefinitionId!, (itemDefinition) => {
- itemDefinition.allowedValues ??= { text: { __$$text: "" } };
- itemDefinition.allowedValues.text.__$$text = value ?? "";
- itemDefinition.allowedValues["@_id"] =
itemDefinition.allowedValues?.["@_id"] ?? generateUuid();
- return;
+ (value: string | undefined, selectedConstraint: ConstraintsType) => {
+ editItemDefinition(itemDefinitionId, (itemDefinition) => {
+ if (value === "" || value === undefined) {
+ itemDefinition.allowedValues = undefined;
+ } else {
+ itemDefinition.allowedValues ??= { text: { __$$text: "" } };
+ itemDefinition.allowedValues.text.__$$text = value;
+ itemDefinition.allowedValues["@_id"] =
itemDefinition.allowedValues?.["@_id"] ?? generateUuid();
+ itemDefinition.allowedValues["@_kie:constraintType"] =
enumToKieConstraintType(selectedConstraint);
+ }
});
},
- [editItemDefinition, itemDefinitionId]
+ [editItemDefinition, enumToKieConstraintType, itemDefinitionId]
);
const onToggleGroupChange = useCallback(
- (newSelection: boolean, event: React.KeyboardEvent<Element> | MouseEvent |
React.MouseEvent<any, MouseEvent>) => {
+ (newSelection: boolean, selectedConstraint: ConstraintsType) => {
if (!newSelection) {
return;
}
- const selection = event.currentTarget.id as ConstraintsType;
- if (selection === ConstraintsType.NONE) {
- editItemDefinition(itemDefinitionId!, (itemDefinition) => {
+
+ editItemDefinition(itemDefinitionId, (itemDefinition) => {
+ if (selectedConstraint === ConstraintsType.NONE) {
itemDefinition.allowedValues = undefined;
- });
- return;
- }
+ return;
+ }
- editItemDefinition(itemDefinitionId!, (itemDefinition) => {
- itemDefinition.allowedValues ??= { text: { __$$text: "" } };
- const previousKieContraintType =
itemDefinition.allowedValues["@_kie:constraintType"];
- itemDefinition.allowedValues["@_kie:constraintType"] =
enumToKieConstraintType(selection);
+ if (itemDefinition.allowedValues) {
+ itemDefinition.allowedValues["@_kie:constraintType"] =
enumToKieConstraintType(selectedConstraint);
+ }
- if (selection === ConstraintsType.EXPRESSION) {
+ if (selectedConstraint === ConstraintsType.EXPRESSION) {
return;
}
if (
- previousKieContraintType === "expression" &&
- selection === ConstraintsType.ENUMERATION &&
- isEnum(
- itemDefinition.allowedValues.text.__$$text,
- constraintTypeHelper(
- (itemDefinition?.typeRef?.__$$text as DmnBuiltInDataType) ??
DmnBuiltInDataType.Undefined
- ).check
- )
+ selectedConstraint === ConstraintsType.ENUMERATION &&
+ isEnum(itemDefinition.allowedValues?.text.__$$text,
typeRefConstraintTypeHelper.check)
) {
return;
}
if (
- previousKieContraintType === "expression" &&
- selection === ConstraintsType.RANGE &&
- isRange(
- itemDefinition.allowedValues.text.__$$text,
- constraintTypeHelper(
- (itemDefinition?.typeRef?.__$$text as DmnBuiltInDataType) ??
DmnBuiltInDataType.Undefined
- ).check
- )
+ selectedConstraint === ConstraintsType.RANGE &&
+ isRange(itemDefinition.allowedValues?.text.__$$text,
typeRefConstraintTypeHelper.check)
) {
return;
}
- itemDefinition.allowedValues.text.__$$text = "";
- return;
+ itemDefinition.allowedValues = undefined;
});
},
- [editItemDefinition, enumToKieConstraintType, itemDefinitionId]
+ [editItemDefinition, itemDefinitionId, enumToKieConstraintType,
typeRefConstraintTypeHelper.check]
);
return (
<Constraints
isReadonly={isReadonly}
- itemDefinition={itemDefinition}
+ itemDefinitionId={itemDefinitionId}
constraintValue={constraintValue}
+ typeHelper={typeRefConstraintTypeHelper}
typeRef={typeRef}
isConstraintEnum={isConstraintEnum}
isConstraintRange={isConstraintRange}
isConstraintEnabled={isConstraintEnabled}
- selectedConstraint={selectedConstraint}
+ selectedKieConstraintType={selectedKieConstraintType}
onToggleGroupChange={onToggleGroupChange}
onConstraintChange={onConstraintChange}
renderOnPropertiesPanel={renderOnPropertiesPanel}
@@ -497,6 +553,14 @@ export function ConstraintsFromTypeConstraintAttribute({
renderOnPropertiesPanel?: boolean;
defaultsToAllowedValues: boolean;
}) {
+ const { externalModelsByNamespace } = useExternalModels();
+ const allDataTypesById = useDmnEditorStore(
+ (s) =>
s.computed(s).getDataTypes(externalModelsByNamespace).allDataTypesById
+ );
+ const allTopLevelItemDefinitionUniqueNames = useDmnEditorStore(
+ (s) =>
s.computed(s).getDataTypes(externalModelsByNamespace).allTopLevelItemDefinitionUniqueNames
+ );
+ const itemDefinitionId = itemDefinition["@_id"]!;
const typeConstraint = useMemo(
() =>
defaultsToAllowedValues
@@ -505,96 +569,111 @@ export function ConstraintsFromTypeConstraintAttribute({
[defaultsToAllowedValues, itemDefinition?.allowedValues,
itemDefinition?.typeConstraint]
);
+ const typeRef = (itemDefinition?.typeRef?.__$$text as DmnBuiltInDataType) ??
DmnBuiltInDataType.Undefined;
+ const typeRefConstraintTypeHelper = useMemo(
+ () => constraintTypeHelper(itemDefinition, allDataTypesById,
allTopLevelItemDefinitionUniqueNames),
+ [allDataTypesById, allTopLevelItemDefinitionUniqueNames, itemDefinition]
+ );
+
+ const rootItemDefinition = useMemo(
+ () => recursivelyGetRootItemDefinition(itemDefinition, allDataTypesById,
allTopLevelItemDefinitionUniqueNames),
+ [allDataTypesById, allTopLevelItemDefinitionUniqueNames, itemDefinition]
+ );
+
+ const enabledConstraints = useMemo(() => {
+ if (isStruct(rootItemDefinition)) {
+ return ["expression"] as KIE__tConstraintType[];
+ }
+ if (isCollection(rootItemDefinition)) {
+ return ["expression"] as KIE__tConstraintType[];
+ }
+ return constrainableBuiltInFeelTypes.get(
+ (rootItemDefinition.typeRef?.__$$text as DmnBuiltInDataType) ??
DmnBuiltInDataType.Undefined
+ );
+ }, [rootItemDefinition]);
+
const {
constraintValue,
- typeRef,
isConstraintEnum,
isConstraintRange,
isConstraintEnabled,
- itemDefinitionId,
- selectedConstraint,
+ selectedKieConstraintType,
enumToKieConstraintType,
} = useConstraint({
constraint: typeConstraint,
- itemDefinition,
- isCollectionConstraintEnable: true, // typeConstraint enables to add a
constraint to the collection itself
+ itemDefinition: itemDefinition,
+ isCollectionConstraintEnabled: true, // typeConstraint enables to add a
constraint to the collection itself
+ constraintTypeHelper: typeRefConstraintTypeHelper,
+ enabledConstraints,
});
const onConstraintChange = useCallback(
- (value?: string) => {
- editItemDefinition(itemDefinitionId!, (itemDefinition) => {
- itemDefinition.typeConstraint ??= { text: { __$$text: "" } };
- itemDefinition.typeConstraint.text.__$$text = value ?? "";
- itemDefinition.typeConstraint["@_id"] =
itemDefinition.typeConstraint?.["@_id"] ?? generateUuid();
+ (value: string | undefined, selectedConstraint: ConstraintsType) => {
+ editItemDefinition(itemDefinitionId, (itemDefinition) => {
+ if (value === "" || value === undefined) {
+ itemDefinition.typeConstraint = undefined;
+ } else {
+ itemDefinition.typeConstraint ??= { text: { __$$text: "" } };
+ itemDefinition.typeConstraint.text.__$$text = value;
+ itemDefinition.typeConstraint["@_id"] =
itemDefinition.typeConstraint?.["@_id"] ?? generateUuid();
+ itemDefinition.typeConstraint["@_kie:constraintType"] =
enumToKieConstraintType(selectedConstraint);
+ }
});
},
- [editItemDefinition, itemDefinitionId]
+ [editItemDefinition, enumToKieConstraintType, itemDefinitionId]
);
const onToggleGroupChange = useCallback(
- (newSelection: boolean, event: React.KeyboardEvent<Element> | MouseEvent |
React.MouseEvent<any, MouseEvent>) => {
+ (newSelection: boolean, selectedConstraint: ConstraintsType) => {
if (!newSelection) {
return;
}
- const selection = event.currentTarget.id as ConstraintsType;
- if (selection === ConstraintsType.NONE) {
- editItemDefinition(itemDefinitionId!, (itemDefinition) => {
+
+ editItemDefinition(itemDefinitionId, (itemDefinition) => {
+ if (selectedConstraint === ConstraintsType.NONE) {
itemDefinition.typeConstraint = undefined;
- });
- return;
- }
+ return;
+ }
- editItemDefinition(itemDefinitionId!, (itemDefinition) => {
- itemDefinition.typeConstraint ??= { text: { __$$text: "" } };
- const previousKieContraintType =
itemDefinition.typeConstraint["@_kie:constraintType"];
- itemDefinition.typeConstraint["@_kie:constraintType"] =
enumToKieConstraintType(selection);
+ if (itemDefinition.typeConstraint) {
+ itemDefinition.typeConstraint["@_kie:constraintType"] =
enumToKieConstraintType(selectedConstraint);
+ }
- if (selection === ConstraintsType.EXPRESSION) {
+ if (selectedConstraint === ConstraintsType.EXPRESSION) {
return;
}
if (
- previousKieContraintType === "expression" &&
- selection === ConstraintsType.ENUMERATION &&
- isEnum(
- itemDefinition.typeConstraint.text.__$$text,
- constraintTypeHelper(
- (itemDefinition?.typeRef?.__$$text as DmnBuiltInDataType) ??
DmnBuiltInDataType.Undefined
- ).check
- )
+ selectedConstraint === ConstraintsType.ENUMERATION &&
+ isEnum(itemDefinition.typeConstraint?.text.__$$text,
typeRefConstraintTypeHelper.check)
) {
return;
}
if (
- previousKieContraintType === "expression" &&
- selection === ConstraintsType.RANGE &&
- isRange(
- itemDefinition.typeConstraint.text.__$$text,
- constraintTypeHelper(
- (itemDefinition?.typeRef?.__$$text as DmnBuiltInDataType) ??
DmnBuiltInDataType.Undefined
- ).check
- )
+ selectedConstraint === ConstraintsType.RANGE &&
+ isRange(itemDefinition.typeConstraint?.text.__$$text,
typeRefConstraintTypeHelper.check)
) {
return;
}
- itemDefinition.typeConstraint.text.__$$text = "";
+ itemDefinition.typeConstraint = undefined;
});
},
- [editItemDefinition, enumToKieConstraintType, itemDefinitionId]
+ [editItemDefinition, itemDefinitionId, enumToKieConstraintType,
typeRefConstraintTypeHelper.check]
);
return (
<Constraints
isReadonly={isReadonly}
- itemDefinition={itemDefinition}
+ itemDefinitionId={itemDefinitionId}
constraintValue={constraintValue}
+ typeHelper={typeRefConstraintTypeHelper}
typeRef={typeRef}
isConstraintEnum={isConstraintEnum}
isConstraintRange={isConstraintRange}
isConstraintEnabled={isConstraintEnabled}
- selectedConstraint={selectedConstraint}
+ selectedKieConstraintType={selectedKieConstraintType}
onToggleGroupChange={onToggleGroupChange}
onConstraintChange={onConstraintChange}
renderOnPropertiesPanel={renderOnPropertiesPanel}
@@ -604,20 +683,22 @@ export function ConstraintsFromTypeConstraintAttribute({
export function Constraints({
isReadonly,
- itemDefinition,
+ itemDefinitionId,
constraintValue,
+ typeHelper,
typeRef,
isConstraintEnum,
isConstraintRange,
isConstraintEnabled,
- selectedConstraint,
+ selectedKieConstraintType,
onToggleGroupChange,
onConstraintChange,
renderOnPropertiesPanel,
}: {
isReadonly: boolean;
- itemDefinition: DMN15__tItemDefinition;
+ itemDefinitionId: string;
constraintValue: string | undefined;
+ typeHelper: TypeHelper;
typeRef: DmnBuiltInDataType;
isConstraintEnum: string[] | undefined;
isConstraintRange: [string, string] | undefined;
@@ -626,14 +707,37 @@ export function Constraints({
range: boolean;
expression: boolean;
};
- selectedConstraint: ConstraintsType;
+ selectedKieConstraintType: ConstraintsType;
renderOnPropertiesPanel?: boolean;
- onToggleGroupChange: (
- selected: boolean,
- event: React.KeyboardEvent<Element> | MouseEvent | React.MouseEvent<any,
MouseEvent>
- ) => void;
- onConstraintChange: (value?: string) => void;
+ onToggleGroupChange: (selected: boolean, selectedConstraint:
ConstraintsType) => void;
+ onConstraintChange: (value: string | undefined, selectedConstraint:
ConstraintsType) => void;
}) {
+ const [internalSelectedConstraint, setInternalSelectedConstraint] =
+ useState<ConstraintsType>(selectedKieConstraintType);
+
+ // Updates the `selectedConstraint` only after changing the active item
definition
+ // Both `internalSelectedConstraint` and `selectedKieConstraintType` should
not be coupled together
+ useEffect(() => {
+ setInternalSelectedConstraint(selectedKieConstraintType);
+ // eslint-disable-next-line
+ }, [itemDefinitionId]);
+
+ const onToggleGroupChangeInternal = useCallback(
+ (selected: boolean, event: React.KeyboardEvent<Element> | MouseEvent |
React.MouseEvent<any, MouseEvent>) => {
+ const selectedConstraint = event.currentTarget.id as ConstraintsType;
+ setInternalSelectedConstraint(selectedConstraint);
+ onToggleGroupChange(selected, selectedConstraint);
+ },
+ [onToggleGroupChange]
+ );
+
+ const onConstraintChangeInternal = useCallback(
+ (value: string | undefined) => {
+ onConstraintChange(value, internalSelectedConstraint);
+ },
+ [onConstraintChange, internalSelectedConstraint]
+ );
+
return (
<>
{isConstraintEnabled.expression === false &&
@@ -656,8 +760,11 @@ export function Constraints({
<ToggleGroupItem
text={ConstraintsType.NONE}
buttonId={ConstraintsType.NONE}
- isSelected={selectedConstraint === ConstraintsType.NONE}
- onChange={onToggleGroupChange}
+ isSelected={
+ selectedKieConstraintType === ConstraintsType.NONE &&
+ internalSelectedConstraint === ConstraintsType.NONE
+ }
+ onChange={onToggleGroupChangeInternal}
isDisabled={isReadonly}
/>
<ToggleGroupItem
@@ -668,74 +775,90 @@ export function Constraints({
style={{ zIndex: 10 }}
text={ConstraintsType.EXPRESSION}
buttonId={ConstraintsType.EXPRESSION}
- isSelected={selectedConstraint === ConstraintsType.EXPRESSION}
- onChange={onToggleGroupChange}
+ isSelected={
+ selectedKieConstraintType === ConstraintsType.EXPRESSION ||
+ internalSelectedConstraint === ConstraintsType.EXPRESSION
+ }
+ onChange={onToggleGroupChangeInternal}
isDisabled={isReadonly || !isConstraintEnabled.expression}
/>
<ToggleGroupItem
text={ConstraintsType.ENUMERATION}
buttonId={ConstraintsType.ENUMERATION}
- isSelected={selectedConstraint === ConstraintsType.ENUMERATION}
- onChange={onToggleGroupChange}
+ isSelected={
+ selectedKieConstraintType === ConstraintsType.ENUMERATION ||
+ internalSelectedConstraint === ConstraintsType.ENUMERATION
+ }
+ onChange={onToggleGroupChangeInternal}
isDisabled={isReadonly || !isConstraintEnabled.enumeration}
/>
<ToggleGroupItem
text={ConstraintsType.RANGE}
buttonId={ConstraintsType.RANGE}
- isSelected={selectedConstraint === ConstraintsType.RANGE}
- onChange={onToggleGroupChange}
+ isSelected={
+ selectedKieConstraintType === ConstraintsType.RANGE ||
+ internalSelectedConstraint === ConstraintsType.RANGE
+ }
+ onChange={onToggleGroupChangeInternal}
isDisabled={isReadonly || !isConstraintEnabled.range}
/>
</ToggleGroup>
</div>
<div style={{ paddingTop: "20px" }}>
- {selectedConstraint === ConstraintsType.ENUMERATION && (
+ {(selectedKieConstraintType === ConstraintsType.ENUMERATION ||
+ internalSelectedConstraint === ConstraintsType.ENUMERATION) && (
<ConstraintsEnum
+ id={itemDefinitionId}
isReadonly={isReadonly}
type={typeRef}
- typeHelper={constraintTypeHelper(typeRef)}
+ typeHelper={typeHelper}
value={isConstraintEnum ? constraintValue : undefined}
expressionValue={constraintValue}
- onSave={onConstraintChange}
+ onSave={onConstraintChangeInternal}
isDisabled={!isConstraintEnabled.enumeration}
renderOnPropertiesPanel={renderOnPropertiesPanel}
/>
)}
- {selectedConstraint === ConstraintsType.RANGE && (
+ {(selectedKieConstraintType === ConstraintsType.RANGE ||
+ internalSelectedConstraint === ConstraintsType.RANGE) && (
<ConstraintsRange
+ id={itemDefinitionId}
isReadonly={isReadonly}
expressionValue={constraintValue}
type={typeRef}
- typeHelper={constraintTypeHelper(typeRef)}
+ typeHelper={typeHelper}
value={isConstraintRange ? constraintValue : undefined}
- onSave={onConstraintChange}
+ onSave={onConstraintChangeInternal}
isDisabled={!isConstraintEnabled.range}
renderOnPropertiesPanel={renderOnPropertiesPanel}
/>
)}
- {selectedConstraint === ConstraintsType.EXPRESSION && (
+ {(selectedKieConstraintType === ConstraintsType.EXPRESSION ||
+ internalSelectedConstraint === ConstraintsType.EXPRESSION) && (
<ConstraintsExpression
+ id={itemDefinitionId}
isReadonly={isReadonly}
type={typeRef}
value={constraintValue}
savedValue={constraintValue}
- onSave={onConstraintChange}
+ onSave={onConstraintChangeInternal}
isDisabled={!isConstraintEnabled.expression}
/>
)}
- {selectedConstraint === ConstraintsType.NONE && (
- <p
- style={{
- padding: "24px",
- background: "#eee",
- borderRadius: "10px",
- textAlign: "center",
- }}
- >
- {`All values are allowed`}
- </p>
- )}
+ {selectedKieConstraintType === ConstraintsType.NONE &&
+ internalSelectedConstraint === ConstraintsType.NONE && (
+ <p
+ style={{
+ padding: "24px",
+ background: "#eee",
+ borderRadius: "10px",
+ textAlign: "center",
+ }}
+ >
+ {`All values are allowed`}
+ </p>
+ )}
</div>
</div>
)}
diff --git a/packages/dmn-editor/src/dataTypes/ConstraintsEnum.tsx
b/packages/dmn-editor/src/dataTypes/ConstraintsEnum.tsx
index 2e113704b92..d92758c9aa6 100644
--- a/packages/dmn-editor/src/dataTypes/ConstraintsEnum.tsx
+++ b/packages/dmn-editor/src/dataTypes/ConstraintsEnum.tsx
@@ -31,6 +31,7 @@ import { ConstraintComponentProps, TypeHelper } from
"./Constraints";
export const ENUM_SEPARATOR = ",";
export function ConstraintsEnum({
+ id,
isReadonly,
value,
expressionValue,
@@ -182,7 +183,7 @@ export function ConstraintsEnum({
<>
<br />
<br />
- <ConstraintsExpression isReadonly={true} value={expressionValue ??
""} type={type} />
+ <ConstraintsExpression id={id} isReadonly={true}
value={expressionValue ?? ""} type={type} />
</>
)}
</div>
diff --git a/packages/dmn-editor/src/dataTypes/ConstraintsExpression.tsx
b/packages/dmn-editor/src/dataTypes/ConstraintsExpression.tsx
index ecd7e13727b..75d53af21b9 100644
--- a/packages/dmn-editor/src/dataTypes/ConstraintsExpression.tsx
+++ b/packages/dmn-editor/src/dataTypes/ConstraintsExpression.tsx
@@ -18,7 +18,7 @@
*/
import * as React from "react";
-import { useMemo, useState, useCallback } from "react";
+import { useMemo, useState, useCallback, useRef, useEffect } from "react";
import { Title } from "@patternfly/react-core/dist/js/components/Title";
import { FeelInput } from "@kie-tools/feel-input-component/dist";
import "./ConstraintsExpression.css";
@@ -28,10 +28,12 @@ import { DmnBuiltInDataType } from
"@kie-tools/boxed-expression-component/dist/a
import { TypeHelper } from "./Constraints";
export function ConstraintsExpression({
+ id,
isReadonly,
value,
onSave,
}: {
+ id: string;
isReadonly: boolean;
value?: string;
savedValue?: string;
@@ -41,15 +43,43 @@ export function ConstraintsExpression({
isDisabled?: boolean;
}) {
const [preview, setPreview] = useState(value ?? "");
- const [editingValue, setEditingValue] = useState(value);
+ const [isEditing, setEditing] = useState(false);
+ const valueCopy = useRef(value);
+
+ const onFeelBlur = useCallback((valueOnBlur: string) => {
+ setEditing(false);
+ }, []);
+
const onFeelChange = useCallback(
(_, content, preview) => {
- onSave?.(content.trim());
setPreview(preview);
+ onSave?.(content.trim());
},
[onSave]
);
+ const onPreviewChanged = useCallback((newPreview: string) =>
setPreview(newPreview), []);
+
+ useEffect(() => {
+ valueCopy.current = isEditing ? valueCopy.current : value;
+ }, [isEditing, value]);
+
+ const onKeyDown = useCallback(
+ (e) => {
+ // When inside FEEL Input, all keyboard events should be kept inside it.
+ // Exceptions to this strategy are handled on `onFeelKeyDown`.
+ if (!isReadonly && isEditing) {
+ e.stopPropagation();
+ }
+
+ // This is used to start editing a cell without being in edit mode.
+ if (!isReadonly && !isEditing) {
+ setEditing(true);
+ }
+ },
+ [isEditing, isReadonly]
+ );
+
const monacoOptions = useMemo(
() => ({
fixedOverflowWidgets: true,
@@ -64,7 +94,9 @@ export function ConstraintsExpression({
);
return (
- <div style={{ display: "flex", flexDirection: "column", width: "100%" }}>
+ // FeelInput doens't react to `onFeelChange` updates
+ // making it necessary to add a key to force a re-render;
+ <div key={id} style={{ display: "flex", flexDirection: "column", width:
"100%" }} onKeyDown={onKeyDown}>
{isReadonly && (
<Title size={"md"} headingLevel="h5" style={{ paddingBottom: "10px" }}>
Equivalent FEEL expression:
@@ -85,9 +117,10 @@ export function ConstraintsExpression({
<p style={{ fontStyle: "italic" }}>{`<None>`}</p>
))}
<FeelInput
- value={isReadonly ? value : editingValue}
+ value={isEditing ? valueCopy.current : value}
onChange={onFeelChange}
- onPreviewChanged={setPreview}
+ onBlur={onFeelBlur}
+ onPreviewChanged={onPreviewChanged}
enabled={!isReadonly}
options={monacoOptions as any}
/>
diff --git a/packages/dmn-editor/src/dataTypes/ConstraintsRange.tsx
b/packages/dmn-editor/src/dataTypes/ConstraintsRange.tsx
index d04e6c85658..b18aca1498e 100644
--- a/packages/dmn-editor/src/dataTypes/ConstraintsRange.tsx
+++ b/packages/dmn-editor/src/dataTypes/ConstraintsRange.tsx
@@ -31,6 +31,7 @@ const CONSTRAINT_START_ID = "start";
const CONSTRAINT_END_ID = "end";
export function ConstraintsRange({
+ id,
isReadonly,
value,
expressionValue,
@@ -312,7 +313,7 @@ export function ConstraintsRange({
{!renderOnPropertiesPanel && (
<>
<br />
- <ConstraintsExpression isReadonly={true} value={expressionValue ??
""} type={type} />
+ <ConstraintsExpression id={id} isReadonly={true}
value={expressionValue ?? ""} type={type} />
</>
)}
</div>
diff --git a/packages/dmn-editor/src/dataTypes/DataTypePanel.tsx
b/packages/dmn-editor/src/dataTypes/DataTypePanel.tsx
index 9279932c753..080955d5791 100644
--- a/packages/dmn-editor/src/dataTypes/DataTypePanel.tsx
+++ b/packages/dmn-editor/src/dataTypes/DataTypePanel.tsx
@@ -357,6 +357,7 @@ export function DataTypePanel({
isDisabled={isReadonly}
typeRef={resolvedTypeRef}
onChange={changeTypeRef}
+ removeDataTypes={[dataType]}
/>
<br />
<br />
diff --git a/packages/dmn-editor/src/dataTypes/DataTypes.tsx
b/packages/dmn-editor/src/dataTypes/DataTypes.tsx
index 3daf48bb213..7d950a6ee67 100644
--- a/packages/dmn-editor/src/dataTypes/DataTypes.tsx
+++ b/packages/dmn-editor/src/dataTypes/DataTypes.tsx
@@ -87,7 +87,7 @@ export type EditItemDefinition = (
export function DataTypes() {
const thisDmnsNamespace = useDmnEditorStore((s) =>
s.dmn.model.definitions["@_namespace"]);
const dmnEditorStoreApi = useDmnEditorStoreApi();
- const { activeItemDefinitionId } = useDmnEditorStore((s) =>
s.dataTypesEditor);
+ const activeItemDefinitionId = useDmnEditorStore((s) =>
s.dataTypesEditor.activeItemDefinitionId);
const [filter, setFilter] = useState("");
const { externalModelsByNamespace } = useExternalModels();
diff --git a/packages/dmn-editor/src/dataTypes/ItemComponentsTable.tsx
b/packages/dmn-editor/src/dataTypes/ItemComponentsTable.tsx
index 7778708f412..7769fd8c709 100644
--- a/packages/dmn-editor/src/dataTypes/ItemComponentsTable.tsx
+++ b/packages/dmn-editor/src/dataTypes/ItemComponentsTable.tsx
@@ -54,7 +54,7 @@ import {
import { getNewDmnIdRandomizer } from "../idRandomizer/dmnIdRandomizer";
import { isEnum } from "./ConstraintsEnum";
import { isRange } from "./ConstraintsRange";
-import { constraintTypeHelper } from "./Constraints";
+import { constraintTypeHelper, recursivelyGetRootItemDefinition } from
"./Constraints";
import { builtInFeelTypeNames } from "./BuiltInFeelTypes";
import { useDmnEditor } from "../DmnEditorContext";
import { DMN15__tItemDefinition } from
"@kie-tools/dmn-marshaller/dist/schemas/dmn-1_5/ts-gen/types";
@@ -95,6 +95,9 @@ export function ItemComponentsTable({
const allTopLevelDataTypesByFeelName = useDmnEditorStore(
(s) =>
s.computed(s).getDataTypes(externalModelsByNamespace).allTopLevelDataTypesByFeelName
);
+ const allTopLevelItemDefinitionUniqueNames = useDmnEditorStore(
+ (s) =>
s.computed(s).getDataTypes(externalModelsByNamespace).allTopLevelItemDefinitionUniqueNames
+ );
const importsByNamespace = useDmnEditorStore((s) =>
s.computed(s).importsByNamespace());
const thisDmnsNamespace = useDmnEditorStore((s) =>
s.dmn.model.definitions["@_namespace"]);
@@ -288,21 +291,37 @@ export function ItemComponentsTable({
return <>Range</>;
}
- const constraintValue =
dt.itemDefinition.allowedValues?.text.__$$text;
- const typeRef =
- (dt.itemDefinition.typeRef?.__$$text as DmnBuiltInDataType)
?? DmnBuiltInDataType.Undefined;
+ const constraintValue =
+ dt.itemDefinition.typeConstraint?.text.__$$text ??
dt.itemDefinition.allowedValues?.text.__$$text;
+
+ const typeHelper = constraintTypeHelper(
+ dt.itemDefinition,
+ allDataTypesById,
+ allTopLevelItemDefinitionUniqueNames
+ );
+
if (constraintValue === undefined) {
return <>None</>;
}
- if (isEnum(constraintValue,
constraintTypeHelper(typeRef).check)) {
+ if (isEnum(constraintValue, typeHelper.check)) {
return <>Enumeration</>;
}
- if (isRange(constraintValue,
constraintTypeHelper(typeRef).check)) {
+ if (isRange(constraintValue, typeHelper.check)) {
return <>Range</>;
}
return <>Expression</>;
};
+ const rootItemDefinition = recursivelyGetRootItemDefinition(
+ dt.itemDefinition,
+ allDataTypesById,
+ allTopLevelItemDefinitionUniqueNames
+ );
+
+ const isItemComponent =
!!parent.itemDefinition?.itemComponent?.find(
+ (ic) => ic["@_id"] === rootItemDefinition["@_id"]
+ );
+
return (
<React.Fragment key={dt.itemDefinition["@_id"]}>
{shouldShowRow && (
@@ -439,7 +458,8 @@ export function ItemComponentsTable({
/>
</td>
<td>
- {canHaveConstraints(dt.itemDefinition) ? (
+ {canHaveConstraints(rootItemDefinition) ||
+ (isStruct(rootItemDefinition) && !isItemComponent) ? (
<Button
variant={ButtonVariant.link}
onClick={() => {
diff --git a/packages/dmn-editor/src/dataTypes/TypeRefSelector.tsx
b/packages/dmn-editor/src/dataTypes/TypeRefSelector.tsx
index 4e01851dd71..42456e8b817 100644
--- a/packages/dmn-editor/src/dataTypes/TypeRefSelector.tsx
+++ b/packages/dmn-editor/src/dataTypes/TypeRefSelector.tsx
@@ -26,7 +26,6 @@ import { ArrowUpIcon } from
"@patternfly/react-icons/dist/js/icons/arrow-up-icon
import { DmnEditorTab } from "../store/Store";
import { useDmnEditorStore, useDmnEditorStoreApi } from
"../store/StoreContext";
import { Button, ButtonVariant } from
"@patternfly/react-core/dist/js/components/Button";
-import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
import { DataType } from "./DataTypes";
import { builtInFeelTypeNames, builtInFeelTypes } from "./BuiltInFeelTypes";
import { Flex } from "@patternfly/react-core/dist/js/layouts/Flex";
@@ -48,6 +47,7 @@ export function TypeRefSelector({
menuAppendTo,
onCreate,
onToggle,
+ removeDataTypes,
}: {
zoom?: number;
heightRef: React.RefObject<HTMLElement>;
@@ -57,6 +57,7 @@ export function TypeRefSelector({
onCreate?: OnCreateDataType;
onToggle?: OnToggle;
menuAppendTo?: "parent";
+ removeDataTypes?: DataType[];
}) {
const [isOpen, setOpen] = useState(false);
const { externalModelsByNamespace } = useExternalModels();
@@ -87,7 +88,9 @@ export function TypeRefSelector({
}
if (s.namespace === state.dmn.model.definitions["@_namespace"]) {
- customDataTypes.push(s);
+ if ((removeDataTypes ?? []).findIndex((removeDataType) =>
removeDataType.feelName === s.feelName) < 0) {
+ customDataTypes.push(s);
+ }
} else {
externalDataTypes.push(s);
}
@@ -113,21 +116,19 @@ export function TypeRefSelector({
spaceItems={{ default: "spaceItemsNone" }}
>
{selectedDataType?.itemDefinition && (
- <Tooltip content="Jump to definition" appendTo={() =>
document.getElementById(id)!}>
- <Button
- title={"Jump to definition"}
- className={"kie-dmn-editor--data-type-jump-to-definition"}
- variant={ButtonVariant.control}
- onClick={(e) =>
- dmnEditorStoreApi.setState((state) => {
- state.navigation.tab = DmnEditorTab.DATA_TYPES;
- state.dataTypesEditor.activeItemDefinitionId =
selectedDataType?.itemDefinition?.["@_id"];
- })
- }
- >
- <ArrowUpIcon />
- </Button>
- </Tooltip>
+ <Button
+ title={"Jump to definition"}
+ className={"kie-dmn-editor--data-type-jump-to-definition"}
+ variant={ButtonVariant.control}
+ onClick={(e) =>
+ dmnEditorStoreApi.setState((state) => {
+ state.navigation.tab = DmnEditorTab.DATA_TYPES;
+ state.dataTypesEditor.activeItemDefinitionId =
selectedDataType?.itemDefinition?.["@_id"];
+ })
+ }
+ >
+ <ArrowUpIcon />
+ </Button>
)}
<Select
toggleRef={toggleRef}
diff --git
a/packages/dmn-editor/src/propertiesPanel/BoxedExpressionPropertiesPanelComponents/Fields.tsx
b/packages/dmn-editor/src/propertiesPanel/BoxedExpressionPropertiesPanelComponents/Fields.tsx
index 5ab9fc11355..f38004f7f21 100644
---
a/packages/dmn-editor/src/propertiesPanel/BoxedExpressionPropertiesPanelComponents/Fields.tsx
+++
b/packages/dmn-editor/src/propertiesPanel/BoxedExpressionPropertiesPanelComponents/Fields.tsx
@@ -18,7 +18,7 @@
*/
import * as React from "react";
-import { useEffect, useState, useRef } from "react";
+import { useEffect, useState } from "react";
import { FormGroup } from "@patternfly/react-core/dist/js/components/Form";
import { InlineFeelNameInput } from "../../feel/InlineFeelNameInput";
import { TextArea } from "@patternfly/react-core/dist/js/components/TextArea";
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]