Skip to content

Commit

Permalink
feat(backoffice): backoffice displays argument index of validation error
Browse files Browse the repository at this point in the history
  • Loading branch information
Vivien-marble committed Aug 25, 2023
1 parent ef43c1c commit 3d6cd60
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 25 deletions.
43 changes: 36 additions & 7 deletions marble-backoffice/src/components/AstNodeComponent.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import Typography from "@mui/material/Typography";
import { type AstNode, type AstNodeEvaluation, NoConstant } from "@/models";
import { NoConstant } from "@/models";
import type { AstNode, AstNodeEvaluation, EvaluationError } from "@/models";
import { AstConstantComponent } from "./AstConstantComponent";
import Paper from "@mui/material/Paper";
import Alert from "@mui/material/Alert";
import Chip from "@mui/material/Chip";

function stringifyAst(node: AstNode): string {
if (node.constant !== NoConstant) {
Expand Down Expand Up @@ -40,11 +42,21 @@ export function AstNodeComponent({
node,
evaluation,
displaySuccess,
argumentError,
}: {
node: AstNode;
evaluation?: AstNodeEvaluation | null;
displaySuccess: boolean;
argumentError?: string;
}) {
const chipColor = !evaluation
? "info"
: evaluation.errors === null
? "default"
: evaluation.errors.length == 0
? "success"
: "error";

return (
<>
<Paper
Expand All @@ -54,8 +66,9 @@ export function AstNodeComponent({
border: 1,
}}
>
{node.name && (
<Typography variant="subtitle1">name: {node.name}</Typography>
{node.name && <Chip label={node.name} color={chipColor} />}
{argumentError && (
<Chip label={`argument Error: ${argumentError}`} color="warning" />
)}
{evaluation &&
displaySuccess &&
Expand All @@ -68,10 +81,7 @@ export function AstNodeComponent({
)}
{node.constant !== NoConstant && (
<Typography>
Constant:{" "}
<AstConstantComponent
constant={node.constant}
/>
Constant: <AstConstantComponent constant={node.constant} />
</Typography>
)}
{!node.name && node.constant === NoConstant && (
Expand All @@ -91,6 +101,11 @@ export function AstNodeComponent({
node={child}
evaluation={evaluation?.children[i]}
displaySuccess={displaySuccess}
argumentError={
evaluation?.errors
? findChildArgumentError(evaluation.errors, { index: i })
: undefined
}
/>
))}
<div>
Expand All @@ -101,6 +116,11 @@ export function AstNodeComponent({
node={child}
evaluation={evaluation?.namedChildren[name]}
displaySuccess={displaySuccess}
argumentError={
evaluation?.errors
? findChildArgumentError(evaluation.errors, { name })
: undefined
}
/>
</div>
))}
Expand All @@ -109,3 +129,12 @@ export function AstNodeComponent({
</>
);
}

function findChildArgumentError(
errors: EvaluationError[],
{ index, name }: { index?: number; name?: string }
): string | undefined {
return errors.find(
(e) => e.argumentIndex === index || e.argumentName === name
)?.error;
}
2 changes: 2 additions & 0 deletions marble-backoffice/src/models/ScenarioValidation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import type { ConstantOptional } from "./AstExpression";
export interface EvaluationError {
error: string;
message: string;
argumentIndex: number | null;
argumentName: string | null;
}

export interface AstNodeEvaluation {
Expand Down
4 changes: 4 additions & 0 deletions marble-backoffice/src/models/ScenarioValidationDto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import { MapObjectValues } from "@/MapUtils";
export const EvaluationErrorSchema = yup.object({
error: yup.string().defined(),
message: yup.string().defined(),
argument_index: yup.number(),
argument_name: yup.string(),
});

type EvaluationErrorDto = yup.InferType<typeof EvaluationErrorSchema>;
Expand Down Expand Up @@ -61,6 +63,8 @@ export function adaptEvaluationError(dto: EvaluationErrorDto): EvaluationError {
return {
error: dto.error,
message: dto.message,
argumentIndex: dto.argument_index ?? null,
argumentName: dto.argument_name ?? null,
};
}

Expand Down
49 changes: 31 additions & 18 deletions marble-backoffice/src/services/AstEditorService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
adaptAstNodeDto,
adaptLitteralAstNode,
} from "@/models/AstExpressionDto";
import { HttpError } from "@/infra/fetchUtils";

export interface AstEditorService {
scenariosRepository: ScenariosRepository;
Expand Down Expand Up @@ -77,24 +78,34 @@ export function useAstEditor(
showLoader(
loadingDispatcher,
(async () => {
if (ruleId === null) {
await patchIteration(
service.scenariosRepository,
scenario.organizationId,
iteration.iterationId,
{
triggerCondition: astNode,
try {
if (ruleId === null) {
await patchIteration(
service.scenariosRepository,
scenario.organizationId,
iteration.iterationId,
{
triggerCondition: astNode,
}
);
} else {
await updateRule(
service.scenariosRepository,
scenario.organizationId,
ruleId,
{
formula: astNode,
}
);
}
} catch (e) {
if (e instanceof HttpError) {
if (e.statusCode / 100 == 4) {
const aa = (await e.response.text()).split("\n")[0]
setErrorMessages([aa]);
}
);
} else {
await updateRule(
service.scenariosRepository,
scenario.organizationId,
ruleId,
{
formula: astNode,
}
);
}
throw e;
}

const validation = await validateIteration(
Expand All @@ -117,7 +128,9 @@ export function useAstEditor(
return;
}

setErrorMessages(flattenNodeEvaluationErrors(validation).map((e) => e.message));
setErrorMessages(
flattenNodeEvaluationErrors(validation).map((e) => e.message)
);
}, [validation]);

return {
Expand Down

0 comments on commit 3d6cd60

Please sign in to comment.