Skip to content

Commit

Permalink
feat: display the number of validation error when saving
Browse files Browse the repository at this point in the history
  • Loading branch information
Vivien-marble committed Aug 21, 2023
1 parent a5d8737 commit fb80b83
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 11 deletions.
25 changes: 24 additions & 1 deletion packages/app-builder/src/repositories/EditorRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ function adaptNodeEvaluation(dto: NodeEvaluationDto): NodeEvaluation {
};
}

function adaptScenarioValidation(
export function adaptScenarioValidation(
dto: ScenarioValidationDto
): ScenarioValidation {
return {
Expand All @@ -45,6 +45,29 @@ function adaptScenarioValidation(
};
}

// return just an array of error from a recursive evaluation
export function flattenNodeEvaluationErrors(
evaluation: NodeEvaluation
): EvaluationError[] {
return [
...(evaluation.errors ?? []),
...evaluation.children.map(flattenNodeEvaluationErrors).flat(),
...Object.values(evaluation.namedChildren)
.map(flattenNodeEvaluationErrors)
.flat(),
];
}

export function countValidationErrors(validation: ScenarioValidation): number {
return (
validation.errors.length +
[validation.triggerEvaluation, ...validation.rulesEvaluations].reduce(
(acc, evaluation) => acc + flattenNodeEvaluationErrors(evaluation).length,
0
)
);
}

export function getEditorRepository() {
return (marbleApiClient: MarbleApi) => ({
listIdentifiers: async ({ scenarioId }: { scenarioId: string }) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import type {
ScenarioValidation,
} from '@app-builder/models';
import { type AstOperator } from '@app-builder/models/ast-operators';
import { countValidationErrors } from '@app-builder/repositories/EditorRepository';
import { EditRule } from '@app-builder/routes/ressources/scenarios/$scenarioId/$iterationId/rules/$ruleId/edit';
import { DeleteRule } from '@app-builder/routes/ressources/scenarios/$scenarioId/$iterationId/rules/delete';
import {
Expand Down Expand Up @@ -44,7 +45,7 @@ interface EditRuleLoaderResult {
customListAccessors: EditorIdentifier[];
};
operators: AstOperator[];
scenarioValidation: ScenarioValidation | null;
scenarioValidation: ScenarioValidation;
scenarioId: string;
}

Expand All @@ -56,6 +57,7 @@ export async function loader({ request, params }: LoaderArgs) {

const ruleId = fromParams(params, 'ruleId');
const scenarioId = fromParams(params, 'scenarioId');
const iterationId = fromParams(params, 'iterationId');

const scenarioIterationRule = scenario.getScenarioIterationRule({
ruleId,
Expand All @@ -69,7 +71,9 @@ export async function loader({ request, params }: LoaderArgs) {
scenarioId,
});

const scenarioValidation: ScenarioValidation | null = null;
const scenarioValidation: ScenarioValidation = await editor.validate({
iterationId: iterationId,
});

return json<EditRuleLoaderResult>({
rule: await scenarioIterationRule,
Expand All @@ -92,7 +96,6 @@ export async function action({ request, params }: ActionArgs) {

try {
const ruleId = fromParams(params, 'ruleId');
const iterationId = fromParams(params, 'iterationId');

const expression = (await request.json()) as {
astNode: AstNode;
Expand All @@ -103,10 +106,6 @@ export async function action({ request, params }: ActionArgs) {
astNode: expression.astNode,
});

const scenarioValidation = await editor.validate({
iterationId: iterationId,
});

setToastMessage(session, {
type: 'success',
messageKey: 'common:success.save',
Expand All @@ -116,7 +115,6 @@ export async function action({ request, params }: ActionArgs) {
success: true as const,
error: null,
values: expression,
scenarioValidation,
},
{ headers: { 'Set-Cookie': await commitSession(session) } }
);
Expand All @@ -130,7 +128,6 @@ export async function action({ request, params }: ActionArgs) {
success: false as const,
error: null,
values: null,
scenarioValidation: null,
},
{ headers: { 'Set-Cookie': await commitSession(session) } }
);
Expand Down Expand Up @@ -165,6 +162,8 @@ export default function RuleEdit() {
defaultValues: { astNode: rule.astNode },
});

const numberOfValidationErrors = countValidationErrors(scenarioValidation);

return (
<ScenarioPage.Container>
<ScenarioPage.Header>
Expand All @@ -180,9 +179,18 @@ export default function RuleEdit() {
</div>
</ScenarioPage.Header>
<ScenarioPage.Content className="max-w-3xl">
{numberOfValidationErrors && (
<Callout>{numberOfValidationErrors} validation error(s)</Callout>
)}
{scenarioValidation && (
<Callout>
<pre>{JSON.stringify(scenarioValidation)}</pre>
<pre
style={{
whiteSpace: 'pre',
}}
>
{JSON.stringify(scenarioValidation, null, 2)}
</pre>
</Callout>
)}
<EditRule
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ export async function action({ request, params }: ActionArgs) {
type: 'success',
messageKey: 'common:success.save',
});

return json(
{
success: true as const,
Expand Down

0 comments on commit fb80b83

Please sign in to comment.