Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kie-issues#1466: A Decision Table with a single output column shouldn't have a name #2834

Open
wants to merge 16 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ enum DecisionTableColumnType {
OutputClause = "output",
Annotation = "annotation",
}

export const DECISION_TABLE_INPUT_DEFAULT_VALUE = "-";
export const DECISION_TABLE_OUTPUT_DEFAULT_VALUE = "";
export const DECISION_TABLE_ANNOTATION_DEFAULT_VALUE = "";
Expand Down Expand Up @@ -777,7 +776,15 @@ export function DecisionTableExpression({
});
}

const nextOutputColumns = [...(prev.output ?? [])];
const nextOutputColumns = [
...(prev.output ?? []).map((outputColumn, index) => {
const outputCopy = { ...outputColumn };
if (outputCopy["@_name"] === undefined) {
outputCopy["@_name"] = `Output-${index + 1}`;
}
return outputCopy;
}),
];
for (/* Add new columns */ let i = 0; i < outputColumnsToAdd.length; i++) {
nextOutputColumns.splice(localIndexInsideGroup + i, 0, outputColumnsToAdd[i]);
}
Expand Down Expand Up @@ -895,11 +902,21 @@ export function DecisionTableExpression({
case DecisionTableColumnType.OutputClause:
const newOutputs = [...(prev.output ?? [])];
newOutputs.splice(localIndexInsideGroup, 1);

//Output name shouldn't be displayed when there is single output column(kie-issues#1466)
const updatedOutputForSingleOutputColumns = [
...(newOutputs ?? []).map((outputColumn) => {
const outputCopy = { ...outputColumn };
if (newOutputs.length === 1) {
outputCopy["@_name"] = undefined;
outputCopy["@_typeRef"] = undefined;
}
return outputCopy;
}),
];
// Do not inline this variable for type safety. See https://github.com/microsoft/TypeScript/issues/241
const retOutput: Normalized<BoxedDecisionTable> = {
...prev,
output: newOutputs,
output: updatedOutputForSingleOutputColumns,
rule: [...(prev.rule ?? [])].map((rule) => {
const newOutputEntry = [...rule.outputEntry];
newOutputEntry.splice(localIndexInsideGroup, 1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ export function getDefaultBoxedExpression({
return relationExpression;
} else if (logicType === "decisionTable") {
const singleOutputColumn = {
name: "Output-1",
name: undefined,
typeRef: dataType?.feelName,
};
const singleInputColumn = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ export function DecisionTableOutputHeaderCell(props: {
const activeDrgElementId = useDmnEditorStore((s) => s.boxedExpressionEditor.activeDrgElementId);
const { dmnEditorRootElementRef } = useDmnEditor();
const { externalModelsByNamespace } = useExternalModels();

const node = useDmnEditorStore((s) =>
s
.computed(s)
Expand Down Expand Up @@ -172,29 +171,35 @@ export function DecisionTableOutputHeaderCell(props: {
/>
</>
)}
<NameField
alternativeFieldName={root?.output.length === 1 ? "Column Name" : undefined}
isReadOnly={props.isReadOnly}
id={cell["@_id"]!}
name={cell?.["@_name"] ?? ""}
getAllUniqueNames={getAllUniqueNames}
onChange={(newName) =>
updater((dmnObject) => {
dmnObject["@_name"] = newName;
})
}
/>
<TypeRefField
alternativeFieldName={root?.output.length === 1 ? "Column Type" : undefined}
isReadOnly={cellMustHaveSameTypeAsRoot ? true : props.isReadOnly}
dmnEditorRootElementRef={dmnEditorRootElementRef}
typeRef={cellMustHaveSameTypeAsRoot ? root?.["@_typeRef"] : cell?.["@_typeRef"]}
onChange={(newTypeRef) =>
updater((dmnObject) => {
dmnObject["@_typeRef"] = newTypeRef;
})
}
/>
{root?.output && root.output.length > 1 ? (
<NameField
isReadOnly={props.isReadOnly}
id={cell["@_id"]!}
name={cell?.["@_name"] ?? ""}
getAllUniqueNames={getAllUniqueNames}
onChange={(newName) =>
updater((dmnObject) => {
dmnObject["@_name"] = newName;
})
}
/>
) : (
""
)}
{root?.output && root.output.length > 1 ? (
<TypeRefField
isReadOnly={cellMustHaveSameTypeAsRoot ? true : props.isReadOnly}
dmnEditorRootElementRef={dmnEditorRootElementRef}
typeRef={cellMustHaveSameTypeAsRoot ? root?.["@_typeRef"] : cell?.["@_typeRef"]}
onChange={(newTypeRef) =>
updater((dmnObject) => {
dmnObject["@_typeRef"] = newTypeRef;
})
}
/>
) : (
""
)}
{itemDefinition && (
<FormGroup label="Constraint">
<ConstraintsFromTypeConstraintAttribute
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ test.describe("Decision Table - Cells Data Type", () => {
await nodes.edit({ name: DefaultNodeName.DECISION });
});

test("Decision table output column type should match the expression header type and be in readonly mode - built-in type", async ({
test("Decision type should match expression header type and output column type should be hidden with a single output column - built-in type", async ({
bee,
beePropertiesPanel,
}) => {
Expand All @@ -42,13 +42,11 @@ test.describe("Decision Table - Cells Data Type", () => {
newDataType: DataType.DateTimeDuration,
});

await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toBeDisabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(
DataType.DateTimeDuration
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).not.toBeAttached();
await expect(beePropertiesPanel.decisionTableOutputHeader.getDataType()).toHaveValue(DataType.DateTimeDuration);
});

test("Decision table output column type should match the expression header type and be in readonly mode - custom type", async ({
test("Decision type should match expression header type and output column type should be hidden with a single output column - custom type", async ({
editor,
dataTypes,
bee,
Expand All @@ -65,11 +63,11 @@ test.describe("Decision Table - Cells Data Type", () => {
await bee.expression.asDecisionTable().outputHeaderAt(0).select();
await beePropertiesPanel.decisionTableOutputHeader.setExpressionCustomDataType({ newDataType: "testType" });

await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toBeDisabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(/^testType\s$/i);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).not.toBeAttached();
await expect(beePropertiesPanel.decisionTableOutputHeader.getDataType()).toHaveValue(/^testType\s$/i);
});

test("Decision table output column with different type than expression header shouldn't be in readonly mode", async ({
test("Decision table output column type shouldn't be there after deleting one output column", async ({
bee,
beePropertiesPanel,
}) => {
Expand All @@ -87,9 +85,8 @@ test.describe("Decision Table - Cells Data Type", () => {
await bee.expression.asDecisionTable().outputHeaderAt(1).contextMenu.option("Delete").click();
await bee.expression.asDecisionTable().outputHeaderAt(0).select();

await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toBeEnabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).not.toBeAttached();
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(DataType.Number);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(DataType.Boolean);
});

test("Decision table fix output column with different type than expression header", async ({
Expand All @@ -110,15 +107,8 @@ test.describe("Decision Table - Cells Data Type", () => {
await bee.expression.asDecisionTable().outputHeaderAt(1).contextMenu.option("Delete").click();
await bee.expression.asDecisionTable().outputHeaderAt(0).select();

await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toBeEnabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).not.toBeAttached();
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(DataType.Number);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(DataType.Boolean);

await beePropertiesPanel.decisionTableOutputHeader.setColumnDataType({ newDataType: DataType.Number });

await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toBeDisabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(DataType.Number);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(DataType.Number);
});
});
});
Expand Down Expand Up @@ -183,8 +173,7 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await beePropertiesPanel.decisionTableOutputHeader.setExpressionDataType({ newDataType: dataType });

await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(`${dataType}`);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(`${dataType}`);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toBeDisabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).not.toBeAttached();
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).not.toBeAttached();
});

Expand Down Expand Up @@ -593,7 +582,6 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(
/^\s*enumType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(/^\s*enumType\s$/i);
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).toBeAttached();
await beePropertiesPanel.decisionTableOutputHeader.expectConstraintButtonsToBeDisabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getEnumerationValueAt(0)).toHaveValue("foo");
Expand Down Expand Up @@ -625,7 +613,6 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(
/^\s*enumType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(/^\s*enumType\s$/i);
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).toBeAttached();
await beePropertiesPanel.decisionTableOutputHeader.expectConstraintButtonsToBeDisabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getEnumerationValueAt(0)).toHaveValue("foo");
Expand All @@ -641,7 +628,6 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(
/^\s*enumType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(/^\s*enumType\s$/i);
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).toBeAttached();
await beePropertiesPanel.decisionTableOutputHeader.expectConstraintButtonsToBeDisabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getEnumerationValueAt(0)).toHaveValue("foo");
Expand Down Expand Up @@ -673,7 +659,6 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(
/^\s*rangeType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(/^\s*rangeType\s$/i);
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).toBeAttached();
await beePropertiesPanel.decisionTableOutputHeader.expectConstraintButtonsToBeDisabled();

Expand Down Expand Up @@ -712,7 +697,6 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(
/^\s*rangeType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(/^\s*rangeType\s$/i);
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).toBeAttached();
await beePropertiesPanel.decisionTableOutputHeader.expectConstraintButtonsToBeDisabled();
await expect(
Expand All @@ -731,7 +715,6 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(
/^\s*rangeType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(/^\s*rangeType\s$/i);
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).toBeAttached();
await beePropertiesPanel.decisionTableOutputHeader.expectConstraintButtonsToBeDisabled();
await expect(
Expand Down Expand Up @@ -769,9 +752,6 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(
/^\s*expressionType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(
/^\s*expressionType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).toBeAttached();
await beePropertiesPanel.decisionTableOutputHeader.expectConstraintButtonsToBeDisabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionConstraintValue()).toHaveText("> 20");
Expand Down Expand Up @@ -801,9 +781,6 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(
/^\s*expressionType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(
/^\s*expressionType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).toBeAttached();
await beePropertiesPanel.decisionTableOutputHeader.expectConstraintButtonsToBeDisabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionConstraintValue()).toHaveText("> 20");
Expand All @@ -817,9 +794,6 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(
/^\s*expressionType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(
/^\s*expressionType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).toBeAttached();
await beePropertiesPanel.decisionTableOutputHeader.expectConstraintButtonsToBeDisabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionConstraintValue()).toHaveText("< 30");
Expand All @@ -845,7 +819,6 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(
/^\s*noneType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(/^\s*noneType\s$/i);
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).toBeAttached();
await beePropertiesPanel.decisionTableOutputHeader.expectConstraintButtonsToBeDisabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getNoneConstraint()).toBeAttached();
Expand All @@ -871,7 +844,6 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(
/^\s*enumType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(/^\s*enumType\s$/i);
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).toBeAttached();
await beePropertiesPanel.decisionTableOutputHeader.expectConstraintButtonsToBeDisabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getEnumerationValueAt(0)).toHaveValue("foo");
Expand All @@ -892,7 +864,6 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(
/^\s*rangeType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(/^\s*rangeType\s$/i);
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).toBeAttached();
await beePropertiesPanel.decisionTableOutputHeader.expectConstraintButtonsToBeDisabled();
await expect(
Expand Down Expand Up @@ -921,9 +892,6 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(
/^\s*expressionType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(
/^\s*expressionType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).toBeAttached();
await beePropertiesPanel.decisionTableOutputHeader.expectConstraintButtonsToBeDisabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionConstraintValue()).toHaveText("> 20");
Expand All @@ -940,7 +908,6 @@ test.describe("Decision Table - Cells Data Type - Constraint", () => {
await expect(beePropertiesPanel.decisionTableOutputHeader.getExpressionDataType()).toHaveValue(
/^\s*noneType\s$/i
);
await expect(beePropertiesPanel.decisionTableOutputHeader.getColumnDataType()).toHaveValue(/^\s*noneType\s$/i);
await expect(beePropertiesPanel.decisionTableOutputHeader.getConstraintSection()).toBeAttached();
await beePropertiesPanel.decisionTableOutputHeader.expectConstraintButtonsToBeDisabled();
await expect(beePropertiesPanel.decisionTableOutputHeader.getNoneConstraint()).toBeAttached();
Expand Down
Loading