Skip to content

Commit

Permalink
[Tech] refacto of LayerGroup
Browse files Browse the repository at this point in the history
  • Loading branch information
claire2212 committed Oct 10, 2024
1 parent 86381cb commit 93ae57f
Show file tree
Hide file tree
Showing 4 changed files with 149 additions and 155 deletions.
10 changes: 0 additions & 10 deletions frontend/src/features/layersSelector/metadataPanel/slice.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { createSelector, createSlice } from '@reduxjs/toolkit'
import { includes } from 'lodash'

import {
MonitorEnvLayers,
Expand Down Expand Up @@ -90,15 +89,6 @@ export const getMetadataIsOpenForRegulatoryLayerId = createSelector(
isOpen && metadataLayerType === MonitorEnvLayers.REGULATORY_ENV && metadataLayerId === layerId
)

export const getMetadataIsOpenForRegulatoryLayerIds = createSelector(
[isMetadataPanelOpen, getMetadataLayerType, getMetadataLayerId, (_, layerIds: number[]) => layerIds],
(isOpen, metadataLayerType, metadataLayerId, layerIds) =>
isOpen &&
metadataLayerType === MonitorEnvLayers.REGULATORY_ENV &&
!!metadataLayerId &&
includes(layerIds, metadataLayerId)
)

export const getMetadataIsOpenForAMPLayerId = createSelector(
[isMetadataPanelOpen, getMetadataLayerType, getMetadataLayerId, (_, layerId: number) => layerId],
(isOpen, metadataLayerType, metadataLayerId, layerId) =>
Expand Down
85 changes: 19 additions & 66 deletions frontend/src/features/layersSelector/myAmps/MyAMPLayerGroup.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import { getIsLinkingAMPToVigilanceArea, vigilanceAreaActions } from '@features/VigilanceArea/slice'
import { Accent, Icon, IconButton, Size, THEME } from '@mtes-mct/monitor-ui'
import { difference, intersection } from 'lodash'
import { useState } from 'react'
import { vigilanceAreaActions } from '@features/VigilanceArea/slice'
import { intersection } from 'lodash'

import { MyAMPLayerZone } from './MyAMPLayerZone'
import { getNumberOfAMPByGroupName } from '../../../api/ampsAPI'
Expand All @@ -10,7 +8,7 @@ import { setFitToExtent } from '../../../domain/shared_slices/Map'
import { useAppDispatch } from '../../../hooks/useAppDispatch'
import { useAppSelector } from '../../../hooks/useAppSelector'
import { getExtentOfLayersGroup } from '../utils/getExtentOfLayersGroup'
import { LayerSelector } from '../utils/LayerSelector.style'
import { MyLayerGroup } from '../utils/MyLayerGroup'

import type { AMP } from '../../../domain/entities/AMPs'

Expand All @@ -29,27 +27,15 @@ export function MyAMPLayerGroup({
const totalNumberOfZones = useAppSelector(state => getNumberOfAMPByGroupName(state, groupName))

const groupLayerIds = layers.map(l => l.id)
const [zonesAreOpen, setZonesAreOpen] = useState(false)
const ampZonesAreShowed = intersection(groupLayerIds, showedAmpLayerIds).length > 0

const ampLinkedToVigilanceAreaForm = useAppSelector(state => state.vigilanceArea.ampToAdd)
const isLinkingAMPToVigilanceArea = useAppSelector(state => getIsLinkingAMPToVigilanceArea(state))

const isLayerGroupDisabled = difference(groupLayerIds, ampLinkedToVigilanceAreaForm).length === 0

const fitToGroupExtent = () => {
const extent = getExtentOfLayersGroup(layers)
dispatch(setFitToExtent(extent))
}

const handleClickOnGroupName = () => {
if (zonesAreOpen) {
fitToGroupExtent()
}

setTotalNumberOfZones(zonesAreOpen ? 0 : totalNumberOfZones)
}

const handleRemoveZone = e => {
e.stopPropagation()
dispatch(removeAmpZonesFromMyLayers(groupLayerIds))
Expand All @@ -65,59 +51,26 @@ export function MyAMPLayerGroup({
}
}

const toggleZonesAreOpen = () => {
setZonesAreOpen(!zonesAreOpen)
}

const addZonesToVigilanceArea = () => {
dispatch(vigilanceAreaActions.addAmpIdsToVigilanceArea(groupLayerIds))
}

return (
<>
<LayerSelector.GroupWrapper $isOpen={zonesAreOpen} $isPadded onClick={toggleZonesAreOpen}>
<LayerSelector.GroupName data-cy="amp-layer-topic" onClick={handleClickOnGroupName} title={groupName}>
{groupName}
</LayerSelector.GroupName>
<LayerSelector.IconGroup>
<LayerSelector.NumberOfZones>{`${layers?.length}/${totalNumberOfZones}`}</LayerSelector.NumberOfZones>
{isLinkingAMPToVigilanceArea ? (
<IconButton
accent={Accent.TERTIARY}
disabled={isLayerGroupDisabled}
Icon={Icon.Plus}
onClick={addZonesToVigilanceArea}
title="Ajouter la/les zone(s) à la zone de vigilance"
/>
) : (
<>
<IconButton
accent={Accent.TERTIARY}
color={ampZonesAreShowed ? THEME.color.charcoal : THEME.color.lightGray}
data-cy={ampZonesAreShowed ? 'my-amp-zone-hide' : 'my-amp-zone-show'}
Icon={Icon.Display}
onClick={toggleLayerDisplay}
title={ampZonesAreShowed ? 'Cacher la/les zone(s)' : 'Afficher la/les zone(s)'}
/>

<IconButton
accent={Accent.TERTIARY}
color={THEME.color.slateGray}
data-cy="my-amp-zone-delete"
Icon={Icon.Close}
onClick={handleRemoveZone}
size={Size.SMALL}
title="Supprimer la/les zone(s) de ma sélection"
/>
</>
)}
</LayerSelector.IconGroup>
</LayerSelector.GroupWrapper>
<LayerSelector.GroupList isOpen={zonesAreOpen} length={layers?.length}>
{layers?.map(layer => (
<MyAMPLayerZone key={layer.id} amp={layer} isDisplayed={showedAmpLayerIds.includes(layer.id)} />
))}
</LayerSelector.GroupList>
</>
<MyLayerGroup
addZonesToVigilanceArea={addZonesToVigilanceArea}
groupName={groupName}
layers={layers}
name="amp"
onRemoveZone={e => handleRemoveZone(e)}
setTotalNumberOfZones={setTotalNumberOfZones}
toggleLayerDisplay={toggleLayerDisplay}
totalNumberOfZones={totalNumberOfZones}
zonesAreShowed={ampZonesAreShowed}
zonesLinkedToVigilanceArea={ampLinkedToVigilanceAreaForm}
>
{layers?.map(layer => (
<MyAMPLayerZone key={layer.id} amp={layer} isDisplayed={showedAmpLayerIds.includes(layer.id)} />
))}
</MyLayerGroup>
)
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import { getIsLinkingRegulatoryToVigilanceArea, vigilanceAreaActions } from '@features/VigilanceArea/slice'
import { IconButton, Accent, Icon, Size, THEME } from '@mtes-mct/monitor-ui'
import { getTitle } from 'domain/entities/layers/utils'
import { difference, intersection } from 'lodash'
import { useState } from 'react'
import { vigilanceAreaActions } from '@features/VigilanceArea/slice'
import { intersection } from 'lodash'

import { RegulatoryLayerZone } from './MyRegulatoryLayerZone'
import { getNumberOfRegulatoryLayerZonesByGroupName } from '../../../api/regulatoryLayersAPI'
Expand All @@ -14,9 +11,8 @@ import {
} from '../../../domain/shared_slices/Regulatory'
import { useAppDispatch } from '../../../hooks/useAppDispatch'
import { useAppSelector } from '../../../hooks/useAppSelector'
import { getMetadataIsOpenForRegulatoryLayerIds } from '../metadataPanel/slice'
import { getExtentOfLayersGroup } from '../utils/getExtentOfLayersGroup'
import { LayerSelector } from '../utils/LayerSelector.style'
import { MyLayerGroup } from '../utils/MyLayerGroup'

import type { RegulatoryLayerCompact } from '../../../domain/entities/regulatory'

Expand All @@ -32,28 +28,11 @@ export function RegulatoryLayerGroup({
const dispatch = useAppDispatch()
const groupLayerIds = layers.map(l => l.id)
const showedRegulatoryLayerIds = useAppSelector(state => state.regulatory.showedRegulatoryLayerIds)
const metadataPanelIsOpen = useAppSelector(state => getMetadataIsOpenForRegulatoryLayerIds(state, groupLayerIds))
const [zonesAreOpen, setZonesAreOpen] = useState(false)

const regulatoryZonesAreShowed = intersection(groupLayerIds, showedRegulatoryLayerIds).length > 0
const totalNumberOfZones = useAppSelector(state => getNumberOfRegulatoryLayerZonesByGroupName(state, groupName))

const regulatoryAreasLinkedToVigilanceAreaForm = useAppSelector(state => state.vigilanceArea.regulatoryAreasToAdd)
const isLinkingRegulatoryToVigilanceArea = useAppSelector(state => getIsLinkingRegulatoryToVigilanceArea(state))

const isLayerGroupDisabled = difference(groupLayerIds, regulatoryAreasLinkedToVigilanceAreaForm).length === 0

const fitToGroupExtent = () => {
const extent = getExtentOfLayersGroup(layers)
dispatch(setFitToExtent(extent))
}

const handleClickOnGroupName = () => {
if (!zonesAreOpen && regulatoryZonesAreShowed) {
fitToGroupExtent()
}

setTotalNumberOfZones(zonesAreOpen ? 0 : totalNumberOfZones)
}

const handleRemoveZone = e => {
e.stopPropagation()
Expand All @@ -71,64 +50,26 @@ export function RegulatoryLayerGroup({
}
}

const toggleZonesAreOpen = () => {
if (!metadataPanelIsOpen) {
setZonesAreOpen(!zonesAreOpen)
}
}

const addZonesToVigilanceArea = () => {
dispatch(vigilanceAreaActions.addRegulatoryAreasToVigilanceArea(groupLayerIds))
}

return (
<>
<LayerSelector.GroupWrapper $isOpen={zonesAreOpen} $isPadded onClick={toggleZonesAreOpen}>
<LayerSelector.GroupName
data-cy="my-regulatory-group"
onClick={handleClickOnGroupName}
title={getTitle(groupName)}
>
{getTitle(groupName)}
</LayerSelector.GroupName>
<LayerSelector.IconGroup>
<LayerSelector.NumberOfZones>{`${layers?.length}/${totalNumberOfZones}`}</LayerSelector.NumberOfZones>
{isLinkingRegulatoryToVigilanceArea ? (
<IconButton
accent={Accent.TERTIARY}
disabled={isLayerGroupDisabled}
Icon={Icon.Plus}
onClick={addZonesToVigilanceArea}
title="Ajouter la/les zone(s) à la zone de vigilance"
/>
) : (
<>
<IconButton
accent={Accent.TERTIARY}
color={regulatoryZonesAreShowed ? THEME.color.charcoal : THEME.color.lightGray}
Icon={Icon.Display}
onClick={toggleLayerDisplay}
title={regulatoryZonesAreShowed ? 'Cacher la/les zone(s)' : 'Afficher la/les zone(s)'}
/>

<IconButton
accent={Accent.TERTIARY}
color={THEME.color.slateGray}
data-cy="my-regulatory-group-delete"
Icon={Icon.Close}
onClick={handleRemoveZone}
size={Size.SMALL}
title="Supprimer la/les zone(s) de ma sélection"
/>
</>
)}
</LayerSelector.IconGroup>
</LayerSelector.GroupWrapper>
<LayerSelector.GroupList isOpen={zonesAreOpen || metadataPanelIsOpen} length={layers?.length}>
{layers?.map(regulatoryZone => (
<RegulatoryLayerZone key={regulatoryZone.id} regulatoryZone={regulatoryZone} />
))}
</LayerSelector.GroupList>
</>
<MyLayerGroup
addZonesToVigilanceArea={addZonesToVigilanceArea}
groupName={groupName}
layers={layers}
name="regulatory"
onRemoveZone={e => handleRemoveZone(e)}
setTotalNumberOfZones={setTotalNumberOfZones}
toggleLayerDisplay={toggleLayerDisplay}
totalNumberOfZones={totalNumberOfZones}
zonesAreShowed={regulatoryZonesAreShowed}
zonesLinkedToVigilanceArea={regulatoryAreasLinkedToVigilanceAreaForm}
>
{layers?.map(regulatoryZone => (
<RegulatoryLayerZone key={regulatoryZone.id} regulatoryZone={regulatoryZone} />
))}
</MyLayerGroup>
)
}
110 changes: 110 additions & 0 deletions frontend/src/features/layersSelector/utils/MyLayerGroup.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import { getIsLinkingZonesToVigilanceArea } from '@features/VigilanceArea/slice'
import { useAppDispatch } from '@hooks/useAppDispatch'
import { useAppSelector } from '@hooks/useAppSelector'
import { IconButton, Accent, Icon, Size, THEME } from '@mtes-mct/monitor-ui'
import { setFitToExtent } from 'domain/shared_slices/Map'
import { difference } from 'lodash'
import { useState } from 'react'

import { getExtentOfLayersGroup } from './getExtentOfLayersGroup'
import { LayerSelector } from './LayerSelector.style'

import type { AMP } from 'domain/entities/AMPs'
import type { RegulatoryLayerCompact } from 'domain/entities/regulatory'

export function MyLayerGroup({
addZonesToVigilanceArea,
children,
groupName,
layers,
name,
onRemoveZone,
setTotalNumberOfZones,
toggleLayerDisplay,
totalNumberOfZones,
zonesAreShowed,
zonesLinkedToVigilanceArea
}: {
addZonesToVigilanceArea: () => void
children: React.ReactNode
groupName: string
layers: AMP[] | RegulatoryLayerCompact[]
name: string
onRemoveZone: (event) => void
setTotalNumberOfZones: (totalNumberOfZones: number) => void
toggleLayerDisplay: (event) => void
totalNumberOfZones: number
zonesAreShowed: boolean
zonesLinkedToVigilanceArea: number[]
}) {
const dispatch = useAppDispatch()

const groupLayerIds = layers.map(l => l.id)
const [zonesAreOpen, setZonesAreOpen] = useState(false)

const isLayerGroupDisabled = difference(groupLayerIds, zonesLinkedToVigilanceArea).length === 0
const isLinkingZonesToVigilanceArea = useAppSelector(state => getIsLinkingZonesToVigilanceArea(state))

const fitToGroupExtent = () => {
const extent = getExtentOfLayersGroup(layers)
dispatch(setFitToExtent(extent))
}

const handleClickOnGroupName = () => {
if (zonesAreOpen) {
fitToGroupExtent()
}

setTotalNumberOfZones(zonesAreOpen ? 0 : totalNumberOfZones)
}

const toggleZonesAreOpen = () => {
setZonesAreOpen(!zonesAreOpen)
}

return (
<>
<LayerSelector.GroupWrapper $isOpen={zonesAreOpen} $isPadded onClick={toggleZonesAreOpen}>
<LayerSelector.GroupName data-cy={`${name}-layer-topic`} onClick={handleClickOnGroupName} title={groupName}>
{groupName}
</LayerSelector.GroupName>
<LayerSelector.IconGroup>
<LayerSelector.NumberOfZones>{`${layers?.length}/${totalNumberOfZones}`}</LayerSelector.NumberOfZones>
{isLinkingZonesToVigilanceArea ? (
<IconButton
accent={Accent.TERTIARY}
disabled={isLayerGroupDisabled}
Icon={Icon.Plus}
onClick={addZonesToVigilanceArea}
title="Ajouter la/les zone(s) à la zone de vigilance"
/>
) : (
<>
<IconButton
accent={Accent.TERTIARY}
color={zonesAreShowed ? THEME.color.charcoal : THEME.color.lightGray}
data-cy={zonesAreShowed ? `my-${name}-zone-hide` : `my-${name}-zone-show`}
Icon={Icon.Display}
onClick={toggleLayerDisplay}
title={zonesAreShowed ? 'Cacher la/les zone(s)' : 'Afficher la/les zone(s)'}
/>

<IconButton
accent={Accent.TERTIARY}
color={THEME.color.slateGray}
data-cy={`my-${name}-zone-delete`}
Icon={Icon.Close}
onClick={onRemoveZone}
size={Size.SMALL}
title="Supprimer la/les zone(s) de ma sélection"
/>
</>
)}
</LayerSelector.IconGroup>
</LayerSelector.GroupWrapper>
<LayerSelector.GroupList isOpen={zonesAreOpen} length={layers?.length}>
{children}
</LayerSelector.GroupList>
</>
)
}

0 comments on commit 93ae57f

Please sign in to comment.