• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

wger-project / react / 24400238877

14 Apr 2026 12:58PM UTC coverage: 74.753% (-0.7%) from 75.488%
24400238877

Pull #1234

github

web-flow
Merge b70152dcd into 47a6ff2da
Pull Request #1234: version 2.5

2018 of 3062 branches covered (65.9%)

Branch coverage included in aggregate %.

125 of 241 new or added lines in 29 files covered. (51.87%)

7 existing lines in 2 files now uncovered.

6077 of 7767 relevant lines covered (78.24%)

28.27 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

16.13
/src/components/Exercises/forms/Variation.tsx
1
import React, { useState } from "react";
6✔
2
import { VariationSelect } from "components/Exercises/forms/VariationSelect";
6✔
3
import { useProfileQuery } from "components/User/queries/profile";
6✔
4
import { editExercise } from "services";
6✔
5

6
export function EditExerciseVariation(props: { exerciseId: number, initial: string | null }) {
6✔
NEW
7
    const [selectedVariationId, setSelectedVariationId] = useState<string | null>(props.initial);
×
NEW
8
    const [selectedNewVariationExerciseId, setSelectedNewVariationExerciseId] = useState<number | null>(null);
×
NEW
9
    const profileQuery = useProfileQuery();
×
10

NEW
11
    const handleChangeVariationId = async (id: string | null) => {
×
NEW
12
        setSelectedVariationId(id);
×
NEW
13
        setSelectedNewVariationExerciseId(null);
×
14

NEW
15
        await editExercise(props.exerciseId, {
×
16
            // eslint-disable-next-line camelcase
17
            variation_group: id,
18
            // eslint-disable-next-line camelcase
19
            license_author: profileQuery.data!.username
20
        });
21
    };
22

NEW
23
    const handleChangeNewVariationExerciseId = async (id: number | null) => {
×
NEW
24
        const previousVariationId = selectedVariationId;
×
NEW
25
        setSelectedNewVariationExerciseId(id);
×
NEW
26
        setSelectedVariationId(null);
×
27

NEW
28
        if (id !== null) {
×
29
            // Generate a new variation group UUID and assign both exercises to it
NEW
30
            const variationGroup = crypto.randomUUID();
×
NEW
31
            try {
×
NEW
32
                await editExercise(props.exerciseId, {
×
33
                    // eslint-disable-next-line camelcase
34
                    variation_group: variationGroup,
35
                    // eslint-disable-next-line camelcase
36
                    license_author: profileQuery.data!.username
37
                });
NEW
38
                await editExercise(id, {
×
39
                    // eslint-disable-next-line camelcase
40
                    variation_group: variationGroup,
41
                    // eslint-disable-next-line camelcase
42
                    license_author: profileQuery.data!.username
43
                });
NEW
44
                setSelectedVariationId(variationGroup);
×
NEW
45
                setSelectedNewVariationExerciseId(null);
×
46
            } catch {
47
                // Rollback on failure
NEW
48
                setSelectedVariationId(previousVariationId);
×
NEW
49
                setSelectedNewVariationExerciseId(null);
×
50
            }
51
        } else {
NEW
52
            try {
×
NEW
53
                await editExercise(props.exerciseId, {
×
54
                    // eslint-disable-next-line camelcase
55
                    variation_group: null,
56
                    // eslint-disable-next-line camelcase
57
                    license_author: profileQuery.data!.username
58
                });
59
            } catch {
NEW
60
                setSelectedVariationId(previousVariationId);
×
61
            }
62
        }
63
    };
64

NEW
65
    return (
×
66
        <VariationSelect
67
            exerciseId={props.exerciseId}
68
            selectedVariationId={selectedVariationId}
69
            selectedNewVariationExerciseId={selectedNewVariationExerciseId}
70
            onChangeVariationId={handleChangeVariationId}
71
            onChangeNewVariationExerciseId={handleChangeNewVariationExerciseId}
72
        />
73
    );
74
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc