All files / components/Announcements AnnouncementsForm.js

100% Statements 5/5
100% Branches 11/11
100% Functions 2/2
100% Lines 5/5

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127                      10x         10x           10x   10x                                                                                                                                                                                 1x                          
import { Button, Form, Row, Col } from 'react-bootstrap';
import { useForm } from 'react-hook-form'
import { useNavigate } from 'react-router-dom'
 
function AnnouncementsForm({ initialContents, submitAction, buttonLabel = "Create" }) {
 
    // Stryker disable all
    const {
        register,
        formState: { errors },
        handleSubmit,
    } = useForm(
        { defaultValues: initialContents || {}, }
    );
    // Stryker restore all
 
    const navigate = useNavigate();
 
    // For explanation, see: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime
    // Note that even this complex regex may still need some tweaks
 
    // Stryker disable next-line Regex
    const isodate_regex = /(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+)|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d)|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d)/i;
 
    return (
 
        <Form onSubmit={handleSubmit(submitAction)}>
 
 
            <Row>
                {initialContents && (
                    <Col>
                        <Form.Group className="mb-3" >
                            <Form.Label htmlFor="id">Id</Form.Label>
                            <Form.Control
                                data-testid="announcementsForm-id"
                                id="id"
                                type="text"
                                {...register("id")}
                                value={initialContents.id}
                                disabled
                            />
                        </Form.Group>
                    </Col>
                )}
 
                <Col>
                    <Form.Group className="mb-3" >
                        <Form.Label htmlFor="start">Start (iso format)</Form.Label>
                        <Form.Control
                            data-testid="announcementsForm-start"
                            id="start"
                            type="text"
                            isInvalid={Boolean(errors.start)}
                            {...register("start", { required: true, pattern: isodate_regex})}
                        />
                        <Form.Control.Feedback type="invalid">
                            {errors.start && 'Start is required. '}
                            {errors.start?.type === 'pattern' && 'Start must be provided in ISO format.'}
 
                        </Form.Control.Feedback>
                    </Form.Group>
                </Col>
                <Col>
                    <Form.Group className="mb-3" >
                        <Form.Label htmlFor="end">End (iso format)</Form.Label>
                        <Form.Control
                            data-testid="announcementsForm-end"
                            id="end"
                            type="text"
                            isInvalid={Boolean(errors.end)}
                            {...register("end", { pattern: isodate_regex})}
                        />
                        <Form.Control.Feedback type="invalid">
                            {errors.end?.type === 'pattern' && 'End must be provided in ISO format.'}
 
                        </Form.Control.Feedback>
                    </Form.Group>
                </Col>
            </Row>
 
            <Row>
                <Col>
                    <Form.Group className="mb-3" >
                        <Form.Label htmlFor="announcement">Announcement</Form.Label>
                        <Form.Control
                            data-testid="announcementsForm-announcement"
                            id="announcement"
                            as="textarea"
                            rows={3}
                            type="textarea"
                            isInvalid={Boolean(errors.announcement)}
                            {...register("announcement", {
                                required: "Announcement is required."
                            })}
                        />
                        <Form.Control.Feedback type="invalid">
                            {errors.announcement?.message}
                        </Form.Control.Feedback>
                    </Form.Group>
                </Col>
            </Row>
 
            <Row>
                <Col>
                    <Button
                        type="submit"
                        data-testid="announcementsForm-submit"
                    >
                        {buttonLabel}
                    </Button>
                    <Button
                        variant="Secondary"
                        onClick={() => navigate(-1)}
                        data-testid="announcementsForm-cancel"
                    >
                        Cancel
                    </Button>
                </Col>
            </Row>
        </Form>
 
    )
}
 
export default AnnouncementsForm;