Skip to content

Commit 43ed9b5

Browse files
feat: fix form field array errors. Remove all periods if is at all times and critical. some vigilance area legend fixes
1 parent a576185 commit 43ed9b5

File tree

9 files changed

+31
-23
lines changed

9 files changed

+31
-23
lines changed

frontend/src/features/Dashboard/components/DashboardForm/VigilanceAreas/Layer.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { dashboardActions, getOpenedPanel } from '@features/Dashboard/slice'
33
import { Dashboard } from '@features/Dashboard/types'
44
import { LayerLegend } from '@features/layersSelector/utils/LayerLegend.style'
55
import { LayerSelector } from '@features/layersSelector/utils/LayerSelector.style'
6-
import { isWithinPeriod } from '@features/VigilanceArea/components/VigilanceAreaForm/utils'
6+
import { isOutOfPeriod, isWithinPeriod } from '@features/VigilanceArea/components/VigilanceAreaForm/utils'
77
import { VigilanceArea } from '@features/VigilanceArea/types'
88
import { useAppSelector } from '@hooks/useAppSelector'
99
import { Accent, Icon, IconButton, Tag, THEME } from '@mtes-mct/monitor-ui'
@@ -72,7 +72,7 @@ export function Layer({ isPinned = false, isSelected = false, vigilanceArea }: V
7272
<StyledTransparentButton $width="70%">
7373
<LayerLegend
7474
border={isWithinPeriod(vigilanceArea?.periods, true) ? `2px solid ${THEME.color.maximumRed}` : undefined}
75-
isDisabled={vigilanceArea?.periods?.length === 0}
75+
isDisabled={isOutOfPeriod(vigilanceArea?.periods)}
7676
layerType={MonitorEnvLayers.VIGILANCE_AREA}
7777
legendKey={vigilanceArea?.comments ?? 'aucun nom'}
7878
type={vigilanceArea?.name ?? 'aucun nom'}

frontend/src/features/VigilanceArea/components/VigilanceAreaForm/Form.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Tooltip } from '@components/Tooltip'
44
import { ZonePicker } from '@components/ZonePicker'
55
import { CancelEditDialog } from '@features/commonComponents/Modals/CancelEditModal'
66
import { DeleteModal } from '@features/commonComponents/Modals/Delete'
7-
import { Periods } from '@features/VigilanceArea/components/VigilanceAreaForm/Periods'
7+
import { Periods } from '@features/VigilanceArea/components/VigilanceAreaForm/Periods/Periods'
88
import { NEW_VIGILANCE_AREA_ID } from '@features/VigilanceArea/constants'
99
import { vigilanceAreaActions, VigilanceAreaFormTypeOpen } from '@features/VigilanceArea/slice'
1010
import { VigilanceArea } from '@features/VigilanceArea/types'

frontend/src/features/VigilanceArea/components/VigilanceAreaForm/Period.tsx renamed to frontend/src/features/VigilanceArea/components/VigilanceAreaForm/Periods/Period.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {
22
CheckboxWrapper,
33
CriticalCheckbox,
44
PeriodCircle
5-
} from '@features/VigilanceArea/components/VigilanceAreaForm/Periods'
5+
} from '@features/VigilanceArea/components/VigilanceAreaForm/Periods/Periods'
66
import { PublishedVigilanceAreaPeriodSchema } from '@features/VigilanceArea/components/VigilanceAreaForm/Schema'
77
import { ValidateButton } from '@features/VigilanceArea/components/VigilanceAreaForm/style'
88
import { VigilanceArea } from '@features/VigilanceArea/types'
@@ -24,25 +24,25 @@ import { omit } from 'lodash'
2424
import { useState } from 'react'
2525
import styled from 'styled-components'
2626

27+
import type { FormikErrors } from 'formik'
28+
2729
type PeriodProps = {
28-
hasError: string | undefined
30+
error: FormikErrors<VigilanceArea.VigilanceAreaPeriod> | undefined
2931
index: number
3032
initialPeriod: VigilanceArea.VigilanceAreaPeriod
3133
onValidate: (vigilanceAreaSource: VigilanceArea.VigilanceAreaPeriod) => void
3234
remove: (index: number) => void
3335
}
3436

35-
export function Period({ hasError, index, initialPeriod, onValidate, remove }: PeriodProps) {
37+
export function Period({ error, index, initialPeriod, onValidate, remove }: PeriodProps) {
3638
const frequencyOptions = getOptionsFromLabelledEnum(VigilanceArea.FrequencyLabel)
3739
const endingConditionOptions = getOptionsFromLabelledEnum(VigilanceArea.EndingConditionLabel)
38-
3940
const isNewlyCreatedPeriod = Object.values(
4041
omit(initialPeriod, ['isCritical', 'id', 'frequency', 'endingCondition'])
4142
).every(value => value === undefined || value === false)
4243
const [isEditing, setIsEditing] = useState(isNewlyCreatedPeriod)
4344
const [editedPeriod, setEditedPeriod] = useState(initialPeriod)
4445
const isValid = (value: VigilanceArea.VigilanceAreaPeriod) => PublishedVigilanceAreaPeriodSchema.isValidSync(value)
45-
4646
const cancel = () => {
4747
if (isNewlyCreatedPeriod) {
4848
remove(index)
@@ -107,7 +107,7 @@ export function Period({ hasError, index, initialPeriod, onValidate, remove }: P
107107
: undefined
108108
}
109109
disabled={editedPeriod.isAtAllTimes}
110-
error={hasError}
110+
error={error?.startDatePeriod || error?.endDatePeriod}
111111
hasSingleCalendar
112112
isCompact
113113
isErrorMessageHidden
@@ -133,7 +133,7 @@ export function Period({ hasError, index, initialPeriod, onValidate, remove }: P
133133
<>
134134
<Select
135135
disabled={editedPeriod.isAtAllTimes}
136-
error={hasError}
136+
error={error?.frequency}
137137
isErrorMessageHidden
138138
isLight
139139
isRequired

frontend/src/features/VigilanceArea/components/VigilanceAreaForm/Periods.tsx renamed to frontend/src/features/VigilanceArea/components/VigilanceAreaForm/Periods/Periods.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
1-
import { Period } from '@features/VigilanceArea/components/VigilanceAreaForm/Period'
1+
import { Period } from '@features/VigilanceArea/components/VigilanceAreaForm/Periods/Period'
22
import { getVigilanceAreaPeriodInitialValues } from '@features/VigilanceArea/components/VigilanceAreaForm/utils'
33
import { VigilanceArea } from '@features/VigilanceArea/types'
44
import { Accent, Button, Checkbox, customDayjs, Icon, Legend } from '@mtes-mct/monitor-ui'
5-
import { FieldArray, useFormikContext } from 'formik'
5+
import { FieldArray, type FormikErrors, useFormikContext } from 'formik'
66
import styled from 'styled-components'
77

88
export function Periods() {
99
const { errors, setFieldValue, values } = useFormikContext<VigilanceArea.VigilanceArea>()
1010

11+
function isArrayOfErrors(
12+
periodErrors: string | FormikErrors<VigilanceArea.VigilanceAreaPeriod>[] | undefined
13+
): periodErrors is FormikErrors<VigilanceArea.VigilanceAreaPeriod>[] {
14+
return Array.isArray(periodErrors)
15+
}
16+
1117
const { periods } = values
1218
const setIsAtAllTimes = (isChecked: boolean | undefined, isCritical: boolean) => {
13-
const filtered = periods?.filter(period => period.isCritical !== isCritical)
19+
// Clean all periods if user set period to all times and critical
20+
const filtered = isCritical ? [] : periods?.filter(period => period.isCritical !== isCritical)
1421

1522
const index = periods?.findIndex(period => period.isAtAllTimes && period.isCritical === isCritical) ?? -1
1623

@@ -44,6 +51,7 @@ export function Periods() {
4451
<PeriodCircle />
4552
<CriticalCheckbox
4653
checked={hasSimpleIsAtAllTimesPeriod}
54+
disabled={hasCriticalIsAtAllTimesPeriod}
4755
isLight
4856
label="Vigilance simple en tout temps"
4957
name="isSimpleAtAllTimes"
@@ -79,7 +87,7 @@ export function Periods() {
7987
return (
8088
<Period
8189
key={period.id ?? index}
82-
hasError={errors.periods}
90+
error={isArrayOfErrors(errors.periods) ? errors.periods[index] : undefined}
8391
index={index}
8492
initialPeriod={period}
8593
onValidate={vigilanceAreaPeriod => {

frontend/src/features/VigilanceArea/components/VigilanceAreaForm/Sources/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export function Sources() {
2828
return (
2929
<Source
3030
key={source.id ?? index}
31-
hasError={meta.error}
31+
hasError={meta.error?.[index]}
3232
index={index}
3333
initialSource={source}
3434
onValidate={vigilanceAreaSource => {
@@ -77,7 +77,7 @@ export function Sources() {
7777
return (
7878
<Source
7979
key={source.id ?? index}
80-
hasError={meta.error}
80+
hasError={meta.error?.[index]}
8181
index={index}
8282
initialSource={source}
8383
onValidate={vigilanceAreaSource => {

frontend/src/features/VigilanceArea/components/VigilanceAreaForm/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { Form } from './Form'
2121
import { VigilanceAreaPanel } from './Panel'
2222
import { VigilanceAreaSchema } from './Schema'
2323
import { Header, SubHeaderContainer, Title, TitleContainer } from './style'
24-
import { getVigilanceAreaInitialValues, isWithinPeriod } from './utils'
24+
import { getVigilanceAreaInitialValues, isOutOfPeriod, isWithinPeriod } from './utils'
2525

2626
type VigilanceAreaFormProps = {
2727
isOpen: boolean
@@ -94,7 +94,7 @@ export function VigilanceAreaForm({ isOpen, isReadOnly = false, vigilanceAreaId
9494
border={
9595
isWithinPeriod(vigilanceArea?.periods, true) ? `2px solid ${THEME.color.maximumRed}` : undefined
9696
}
97-
isDisabled={vigilanceArea?.periods?.length === 0}
97+
isDisabled={isOutOfPeriod(vigilanceArea?.periods)}
9898
layerType={MonitorEnvLayers.VIGILANCE_AREA}
9999
legendKey={vigilanceArea?.comments ?? 'aucun nom'}
100100
size={Size.NORMAL}

frontend/src/features/VigilanceArea/components/VigilanceAreasList/Cells/PeriodsCell.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Tooltip } from '@components/Tooltip'
2-
import { BasePeriodCircle } from '@features/VigilanceArea/components/VigilanceAreaForm/Periods'
2+
import { BasePeriodCircle } from '@features/VigilanceArea/components/VigilanceAreaForm/Periods/Periods'
33
import { PeriodCell } from '@features/VigilanceArea/components/VigilanceAreasList/Cells/PeriodCell'
44
import { VigilanceArea } from '@features/VigilanceArea/types'
55
import styled from 'styled-components'

frontend/src/features/layersSelector/myVigilanceAreas/MyVigilanceAreaLayerZone.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useGetVigilanceAreasQuery } from '@api/vigilanceAreasAPI'
22
import { StyledTransparentButton } from '@components/style'
3-
import { isWithinPeriod } from '@features/VigilanceArea/components/VigilanceAreaForm/utils'
3+
import { isOutOfPeriod, isWithinPeriod } from '@features/VigilanceArea/components/VigilanceAreaForm/utils'
44
import { vigilanceAreaActions } from '@features/VigilanceArea/slice'
55
import { useAppSelector } from '@hooks/useAppSelector'
66
import { Accent, Icon, IconButton, OPENLAYERS_PROJECTION, Size, THEME, WSG84_PROJECTION } from '@mtes-mct/monitor-ui'
@@ -78,7 +78,7 @@ export function MyVigilanceAreaLayerZone({
7878
<StyledTransparentButton onClick={zoomToLayerExtent}>
7979
<LayerLegend
8080
border={isWithinPeriod(layer?.periods, true) ? `2px solid ${THEME.color.maximumRed}` : undefined}
81-
isDisabled={layer?.periods?.length === 0}
81+
isDisabled={isOutOfPeriod(layer?.periods)}
8282
layerType={MonitorEnvLayers.VIGILANCE_AREA}
8383
legendKey={layer?.comments}
8484
type={layer?.name ?? 'aucun nom'}

frontend/src/features/layersSelector/search/ResultsList/VigilanceAreaLayer/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { StyledTransparentButton } from '@components/style'
2-
import { isWithinPeriod } from '@features/VigilanceArea/components/VigilanceAreaForm/utils'
2+
import { isOutOfPeriod, isWithinPeriod } from '@features/VigilanceArea/components/VigilanceAreaForm/utils'
33
import { vigilanceAreaActions } from '@features/VigilanceArea/slice'
44
import { useTracking } from '@hooks/useTracking'
55
import { Accent, Icon, IconButton, OPENLAYERS_PROJECTION, THEME, WSG84_PROJECTION } from '@mtes-mct/monitor-ui'
@@ -99,7 +99,7 @@ export function VigilanceAreaLayer({ layer, searchedText }: RegulatoryLayerProps
9999
<StyledTransparentButton onClick={toggleZoneMetadata}>
100100
<LayerLegend
101101
border={isWithinPeriod(layer?.periods, true) ? `2px solid ${THEME.color.maximumRed}` : undefined}
102-
isDisabled={layer?.periods?.length === 0}
102+
isDisabled={isOutOfPeriod(layer?.periods)}
103103
layerType={MonitorEnvLayers.VIGILANCE_AREA}
104104
legendKey={layer?.comments}
105105
type={layer?.name ?? 'aucun'}

0 commit comments

Comments
 (0)