diff --git a/.github/workflows/cicd-app.yml b/.github/workflows/cicd-app.yml index 42ba10c3ad..9418439240 100644 --- a/.github/workflows/cicd-app.yml +++ b/.github/workflows/cicd-app.yml @@ -187,6 +187,7 @@ jobs: e2e_test: name: Run E2E tests + if: false needs: [ version, build ] runs-on: ubuntu-22.04 strategy: @@ -308,7 +309,7 @@ jobs: generate_and_upload_source_maps: name: Generate and upload source maps to Sentry - needs: [ version, build, unit_test_backend, unit_test_frontend, e2e_test ] + needs: [ version, build, unit_test_backend, unit_test_frontend ] runs-on: ubuntu-22.04 env: VERSION: ${{ needs.version.outputs.VERSION }} @@ -351,7 +352,7 @@ jobs: push_to_registry: name: Push to registry - needs: [ version, unit_test_backend, unit_test_frontend, e2e_test, generate_and_upload_source_maps ] + needs: [ version, unit_test_backend, unit_test_frontend, generate_and_upload_source_maps ] # needs: [version, e2e_test, e2e_multi_windows_test, unit_test_frontend, e2e_test] runs-on: ubuntu-22.04 if: startsWith(github.ref, 'refs/heads/dependabot') == false diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/amp/AMPEntity.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/amp/AMPEntity.kt index ea667ced8c..0f8e01a853 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/amp/AMPEntity.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/amp/AMPEntity.kt @@ -5,7 +5,7 @@ import org.locationtech.jts.geom.MultiPolygon data class AMPEntity( val id: Int, val designation: String, - val geom: MultiPolygon, + val geom: MultiPolygon?, val name: String, val refReg: String? = null, val type: String? = null, diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/regulatoryArea/RegulatoryAreaEntity.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/regulatoryArea/RegulatoryAreaEntity.kt index cd8ffbb134..e6fca539f2 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/regulatoryArea/RegulatoryAreaEntity.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/regulatoryArea/RegulatoryAreaEntity.kt @@ -4,23 +4,23 @@ import fr.gouv.cacem.monitorenv.domain.entities.tags.TagEntity import fr.gouv.cacem.monitorenv.domain.entities.themes.ThemeEntity import org.locationtech.jts.geom.MultiPolygon -data class RegulatoryAreaEntity( +class RegulatoryAreaEntity( val id: Int, - val geom: MultiPolygon? = null, + val date: String? = null, + val dateFin: String? = null, + val dureeValidite: String? = null, + val editeur: String? = null, + val edition: String? = null, val entityName: String? = null, - val url: String? = null, - val layerName: String? = null, val facade: String? = null, + val geom: MultiPolygon? = null, + val layerName: String? = null, + val observation: String? = null, val refReg: String? = null, - val edition: String? = null, - val editeur: String? = null, val source: String? = null, - val observation: String? = null, - val tags: List, - val themes: List, - val date: String? = null, - val dureeValidite: String? = null, - val dateFin: String? = null, val temporalite: String? = null, val type: String? = null, + val url: String? = null, + val tags: List = emptyList(), + val themes: List = emptyList(), ) diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IAMPRepository.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IAMPRepository.kt index b0c5028747..2a023ce574 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IAMPRepository.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IAMPRepository.kt @@ -4,9 +4,17 @@ import fr.gouv.cacem.monitorenv.domain.entities.amp.AMPEntity import org.locationtech.jts.geom.Geometry interface IAMPRepository { - fun findAll(): List + fun findAll( + withGeometry: Boolean, + zoom: Int? = null, + bbox: List? = null, + ): List fun count(): Long fun findAllIdsByGeometry(geometry: Geometry): List + + fun findAllByIds(ids: List): List + + fun findById(id: Int): AMPEntity? } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IRegulatoryAreaRepository.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IRegulatoryAreaRepository.kt index 2f2e23a997..e050a393e7 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IRegulatoryAreaRepository.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IRegulatoryAreaRepository.kt @@ -6,7 +6,13 @@ import org.locationtech.jts.geom.Geometry interface IRegulatoryAreaRepository { fun findById(id: Int): RegulatoryAreaEntity? - fun findAll(): List + fun findAllByIds(ids: List): List + + fun findAll( + withGeometry: Boolean, + zoom: Int? = null, + bbox: List? = null, + ): List fun count(): Long diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/amps/GetAMPById.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/amps/GetAMPById.kt new file mode 100644 index 0000000000..616561b1d5 --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/amps/GetAMPById.kt @@ -0,0 +1,22 @@ +package fr.gouv.cacem.monitorenv.domain.use_cases.amps + +import fr.gouv.cacem.monitorenv.config.UseCase +import fr.gouv.cacem.monitorenv.domain.entities.amp.AMPEntity +import fr.gouv.cacem.monitorenv.domain.exceptions.BackendUsageErrorCode +import fr.gouv.cacem.monitorenv.domain.exceptions.BackendUsageException +import fr.gouv.cacem.monitorenv.domain.repositories.IAMPRepository +import org.slf4j.LoggerFactory + +@UseCase +class GetAMPById( + private val ampRepository: IAMPRepository, +) { + private val logger = LoggerFactory.getLogger(GetAMPById::class.java) + + fun execute(id: Int): AMPEntity { + ampRepository.findById(id)?.let { return it } + val errorMessage = "amp $id not found" + logger.error(errorMessage) + throw BackendUsageException(BackendUsageErrorCode.ENTITY_NOT_FOUND, errorMessage) + } +} diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/amps/GetAMPsByIds.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/amps/GetAMPsByIds.kt new file mode 100644 index 0000000000..97ed3b2bdd --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/amps/GetAMPsByIds.kt @@ -0,0 +1,12 @@ +package fr.gouv.cacem.monitorenv.domain.use_cases.amps + +import fr.gouv.cacem.monitorenv.config.UseCase +import fr.gouv.cacem.monitorenv.domain.entities.amp.AMPEntity +import fr.gouv.cacem.monitorenv.domain.repositories.IAMPRepository + +@UseCase +class GetAMPsByIds( + private val ampRepository: IAMPRepository, +) { + fun execute(ids: List): List = ampRepository.findAllByIds(ids) +} diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/amps/GetAllAMPs.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/amps/GetAllAMPs.kt index 22f5d04ee9..6e669366eb 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/amps/GetAllAMPs.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/amps/GetAllAMPs.kt @@ -11,9 +11,13 @@ class GetAllAMPs( ) { private val logger = LoggerFactory.getLogger(GetAllAMPs::class.java) - fun execute(): List { + fun execute( + withGeometry: Boolean, + zoom: Int? = null, + bbox: List? = null, + ): List { logger.info("Attempt to GET all AMPs") - val amps = ampRepository.findAll() + val amps = ampRepository.findAll(withGeometry, zoom, bbox) logger.info("Found ${amps.size} AMPs") return amps diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/regulatoryAreas/GetAllRegulatoryAreas.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/regulatoryAreas/GetAllRegulatoryAreas.kt index 8f15320260..ab4aa5cb05 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/regulatoryAreas/GetAllRegulatoryAreas.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/regulatoryAreas/GetAllRegulatoryAreas.kt @@ -11,9 +11,13 @@ class GetAllRegulatoryAreas( ) { private val logger = LoggerFactory.getLogger(GetAllRegulatoryAreas::class.java) - fun execute(): List { + fun execute( + withGeometry: Boolean, + zoom: Int? = null, + bbox: List? = null, + ): List { logger.info("Attempt to GET all regulatory areas") - val regulatoryAreas = regulatoryAreaRepository.findAll() + val regulatoryAreas = regulatoryAreaRepository.findAll(withGeometry, zoom, bbox) logger.info("Found ${regulatoryAreas.size} regulatory areas") return regulatoryAreas diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/regulatoryAreas/GetRegulatoryAreasByIds.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/regulatoryAreas/GetRegulatoryAreasByIds.kt new file mode 100644 index 0000000000..00afa12720 --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/regulatoryAreas/GetRegulatoryAreasByIds.kt @@ -0,0 +1,14 @@ +@file:Suppress("ktlint:standard:package-name") + +package fr.gouv.cacem.monitorenv.domain.use_cases.regulatoryAreas + +import fr.gouv.cacem.monitorenv.config.UseCase +import fr.gouv.cacem.monitorenv.domain.entities.regulatoryArea.RegulatoryAreaEntity +import fr.gouv.cacem.monitorenv.domain.repositories.IRegulatoryAreaRepository + +@UseCase +class GetRegulatoryAreasByIds( + private val regulatoryAreaRepository: IRegulatoryAreaRepository, +) { + fun execute(ids: List): List = regulatoryAreaRepository.findAllByIds(ids) +} diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/AMPDataOutput.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/AMPDataOutput.kt index 2e3d081404..58838f0f3b 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/AMPDataOutput.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/AMPDataOutput.kt @@ -6,7 +6,7 @@ import org.locationtech.jts.geom.MultiPolygon data class AMPDataOutput( val id: Int, val designation: String, - val geom: MultiPolygon, + val geom: MultiPolygon?, val name: String, val refReg: String? = null, val type: String? = null, diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/Amps.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/Amps.kt index 52db8549a6..d8a1953a46 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/Amps.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/Amps.kt @@ -1,12 +1,18 @@ package fr.gouv.cacem.monitorenv.infrastructure.api.endpoints.bff.v1 -import com.fasterxml.jackson.databind.ObjectMapper +import fr.gouv.cacem.monitorenv.domain.use_cases.amps.GetAMPById +import fr.gouv.cacem.monitorenv.domain.use_cases.amps.GetAMPsByIds import fr.gouv.cacem.monitorenv.domain.use_cases.amps.GetAllAMPs import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.bff.outputs.AMPDataOutput import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.tags.Tag +import jakarta.websocket.server.PathParam import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RestController @RestController @@ -14,12 +20,37 @@ import org.springframework.web.bind.annotation.RestController @Tag(name = "BFF.AMP", description = "API des Aires Marines Protégées (AMP)") class Amps( private val getAllAMPs: GetAllAMPs, - private val objectMapper: ObjectMapper, + private val getAMPsByIds: GetAMPsByIds, + private val getAMPById: GetAMPById, ) { @GetMapping("") @Operation(summary = "Get AMPs") - fun getAll(): List { - val amps = getAllAMPs.execute() + fun getAll( + @RequestParam(name = "withGeometry") withGeometry: Boolean, + @RequestParam(name = "zoom", required = false) zoom: Int?, + @RequestParam(name = "bbox", required = false) bbox: List?, + ): List { + val amps = getAllAMPs.execute(withGeometry, zoom, bbox) return amps.map { AMPDataOutput.fromAMPEntity(it) } } + + @PostMapping("") + @Operation(summary = "Get AMPs by ids") + fun getAll( + @RequestBody ids: List, + ): List { + val amps = getAMPsByIds.execute(ids) + return amps.map { AMPDataOutput.fromAMPEntity(it) } + } + + @GetMapping("/{ampId}") + @Operation(summary = "Get AMP by Id") + fun get( + @PathParam("Amp id") + @PathVariable(name = "ampId") + ampId: Int, + ): AMPDataOutput? = + getAMPById.execute(id = ampId).let { + AMPDataOutput.fromAMPEntity(it) + } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/RegulatoryAreas.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/RegulatoryAreas.kt index 6aeb02f87c..7fc7725f48 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/RegulatoryAreas.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/RegulatoryAreas.kt @@ -2,13 +2,17 @@ package fr.gouv.cacem.monitorenv.infrastructure.api.endpoints.bff.v1 import fr.gouv.cacem.monitorenv.domain.use_cases.regulatoryAreas.GetAllRegulatoryAreas import fr.gouv.cacem.monitorenv.domain.use_cases.regulatoryAreas.GetRegulatoryAreaById +import fr.gouv.cacem.monitorenv.domain.use_cases.regulatoryAreas.GetRegulatoryAreasByIds import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.bff.outputs.RegulatoryAreaWithMetadataDataOutput import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.tags.Tag import jakarta.websocket.server.PathParam import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RestController @RestController @@ -17,6 +21,7 @@ import org.springframework.web.bind.annotation.RestController class RegulatoryAreas( private val getAllRegulatoryAreas: GetAllRegulatoryAreas, private val getRegulatoryAreaById: GetRegulatoryAreaById, + private val getRegulatoryAreasByIds: GetRegulatoryAreasByIds, ) { @GetMapping("/{regulatoryAreaId}") @Operation(summary = "Get regulatory area by Id") @@ -31,8 +36,21 @@ class RegulatoryAreas( @GetMapping("") @Operation(summary = "Get regulatory Areas") - fun getAll(): List { - val regulatoryAreas = getAllRegulatoryAreas.execute() + fun getAll( + @RequestParam(name = "withGeometry") withGeometry: Boolean, + @RequestParam(name = "zoom", required = false) zoom: Int?, + @RequestParam(name = "bbox", required = false) bbox: List?, + ): List { + val regulatoryAreas = getAllRegulatoryAreas.execute(withGeometry, zoom, bbox) return regulatoryAreas.map { RegulatoryAreaWithMetadataDataOutput.fromRegulatoryAreaEntity(it) } } + + @PostMapping("") + @Operation(summary = "Get regulatory Areas by ids") + fun getAll( + @RequestBody ids: List, + ): List = + getRegulatoryAreasByIds + .execute(ids) + .map { RegulatoryAreaWithMetadataDataOutput.fromRegulatoryAreaEntity(it) } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/AMPModel.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/AMPModel.kt index eeba8caeeb..11335afb19 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/AMPModel.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/AMPModel.kt @@ -16,7 +16,7 @@ data class AMPModel( @Column(name = "des_desigfr") val designation: String, @Column(name = "geom") - val geom: MultiPolygon, + val geom: MultiPolygon?, @Column(name = "mpa_oriname") val name: String, @Column(name = "ref_reg") diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/RegulatoryAreaModel.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/RegulatoryAreaModel.kt index a676411ab1..b6a59ea040 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/RegulatoryAreaModel.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/RegulatoryAreaModel.kt @@ -39,12 +39,12 @@ data class RegulatoryAreaModel( mappedBy = "regulatoryArea", fetch = FetchType.LAZY, ) - var tags: List, + var tags: List = emptyList(), @OneToMany( mappedBy = "regulatoryArea", fetch = FetchType.LAZY, ) - var themes: List, + var themes: List = emptyList(), @Column(name = "type") val type: String?, @Column(name = "url") val url: String?, ) { diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaAMPRepository.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaAMPRepository.kt index f886494e02..98a8448015 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaAMPRepository.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaAMPRepository.kt @@ -4,15 +4,33 @@ import fr.gouv.cacem.monitorenv.domain.entities.amp.AMPEntity import fr.gouv.cacem.monitorenv.domain.repositories.IAMPRepository import fr.gouv.cacem.monitorenv.infrastructure.database.repositories.interfaces.IDBAMPRepository import org.locationtech.jts.geom.Geometry +import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Repository @Repository class JpaAMPRepository( private val dbAMPRepository: IDBAMPRepository, ) : IAMPRepository { - override fun findAll(): List = dbAMPRepository.findAllByOrderByName().map { it.toAMP() } + override fun findAll( + withGeometry: Boolean, + zoom: Int?, + bbox: List?, + ): List = + dbAMPRepository + .findAllByOrderByName( + zoom, + bbox?.get(0), + bbox?.get(1), + bbox?.get(2), + bbox?.get(3), + withGeometry, + ).map { it.toAMP() } override fun count(): Long = dbAMPRepository.count() override fun findAllIdsByGeometry(geometry: Geometry): List = dbAMPRepository.findAllIdsByGeom(geometry) + + override fun findAllByIds(ids: List): List = dbAMPRepository.findAllById(ids).map { it.toAMP() } + + override fun findById(id: Int): AMPEntity? = dbAMPRepository.findByIdOrNull(id)?.toAMP() } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaRegulatoryAreaRepository.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaRegulatoryAreaRepository.kt index 3a0fdf3369..cf33a20c73 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaRegulatoryAreaRepository.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaRegulatoryAreaRepository.kt @@ -3,6 +3,7 @@ package fr.gouv.cacem.monitorenv.infrastructure.database.repositories import fr.gouv.cacem.monitorenv.domain.entities.regulatoryArea.RegulatoryAreaEntity import fr.gouv.cacem.monitorenv.domain.repositories.IRegulatoryAreaRepository import fr.gouv.cacem.monitorenv.infrastructure.database.repositories.interfaces.IDBRegulatoryAreaRepository +import jakarta.transaction.Transactional import org.locationtech.jts.geom.Geometry import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Repository @@ -11,12 +12,28 @@ import org.springframework.stereotype.Repository class JpaRegulatoryAreaRepository( private val dbRegulatoryAreaRepository: IDBRegulatoryAreaRepository, ) : IRegulatoryAreaRepository { - override fun findAll(): List = - dbRegulatoryAreaRepository.findAllByOrderByLayerName().map { it.toRegulatoryArea() } + @Transactional + override fun findAll( + withGeometry: Boolean, + zoom: Int?, + bbox: List?, + ): List = + dbRegulatoryAreaRepository + .findAllByOrderByLayerName( + zoom, + bbox?.get(0), + bbox?.get(1), + bbox?.get(2), + bbox?.get(3), + withGeometry, + ).map { it.toRegulatoryArea() } override fun findById(id: Int): RegulatoryAreaEntity? = dbRegulatoryAreaRepository.findByIdOrNull(id)?.toRegulatoryArea() + override fun findAllByIds(ids: List): List = + dbRegulatoryAreaRepository.findAllById(ids).map { it.toRegulatoryArea() } + override fun count(): Long = dbRegulatoryAreaRepository.count() override fun findAllIdsByGeometry(geometry: Geometry): List = diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/interfaces/IDBAMPRepository.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/interfaces/IDBAMPRepository.kt index 231c6f659d..3b4d71b705 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/interfaces/IDBAMPRepository.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/interfaces/IDBAMPRepository.kt @@ -9,12 +9,55 @@ interface IDBAMPRepository : JpaRepository { @Query( value = """ - SELECT id FROM AMPModel WHERE ST_INTERSECTS(st_setsrid(geom, 4326), ST_Buffer(st_setsrid(:geometry, 4326), 0)) """, ) fun findAllIdsByGeom(geometry: Geometry): List - fun findAllByOrderByName(): List + @Query( + value = """ + SELECT + a.id, + a.des_desigfr, + CASE + WHEN :withGeometry IS FALSE THEN NULL + WHEN :withGeometry IS TRUE AND (:zoom IS NULL OR :zoom >= 14) THEN + a.geom + WHEN :withGeometry IS TRUE AND :zoom < 14 THEN + ST_Multi( + ST_CollectionExtract( + ST_MakeValid( + ST_SimplifyPreserveTopology( + a.geom, + CASE + WHEN :zoom <= 5 THEN 0.01 + WHEN :zoom <= 7 THEN 0.05 + WHEN :zoom <= 11 THEN 0.001 + ELSE 0.0001 + END + ) + ), 3) + ) + END as geom, + a.mpa_oriname, + a.ref_reg, + a.mpa_type, + a.url_legicem + FROM amp_cacem a + WHERE + (:withGeometry IS FALSE OR :minX IS NULL OR :minY IS NULL OR :maxX IS NULL OR :maxY IS NULL) + OR ST_Intersects(a.geom, ST_MakeEnvelope(:minX, :minY, :maxX, :maxY, 4326)) + ORDER BY a.mpa_oriname + """, + nativeQuery = true, + ) + fun findAllByOrderByName( + zoom: Int?, + minX: Double?, + minY: Double?, + maxX: Double?, + maxY: Double?, + withGeometry: Boolean, + ): List } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/interfaces/IDBRegulatoryAreaRepository.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/interfaces/IDBRegulatoryAreaRepository.kt index 90f375fcee..a566520aff 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/interfaces/IDBRegulatoryAreaRepository.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/interfaces/IDBRegulatoryAreaRepository.kt @@ -6,6 +6,61 @@ import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.Query interface IDBRegulatoryAreaRepository : JpaRepository { + @Query( + value = """ + SELECT + r.id, + r.date, + r.date_fin, + r.duree_validite, + r.editeur, + r.edition, + r.entity_name, + r.facade, + CASE + WHEN :withGeometry IS FALSE THEN NULL + WHEN :withGeometry IS TRUE AND (:zoom IS NULL OR :zoom >= 14) THEN + r.geom + WHEN :withGeometry IS TRUE AND :zoom < 14 THEN + ST_Multi( + ST_CollectionExtract( + ST_MakeValid( + ST_SimplifyPreserveTopology( + r.geom, + CASE + WHEN :zoom <= 5 THEN 0.01 + WHEN :zoom <= 7 THEN 0.05 + WHEN :zoom <= 11 THEN 0.001 + ELSE 0.0001 + END + ) + ), 3) + ) + END as geom, + r.layer_name, + r.observation, + r.ref_reg, + r.source, + r.temporalite, + r.type, + r.url + FROM regulations_cacem r + WHERE + (:withGeometry IS FALSE OR :minX IS NULL OR :minY IS NULL OR :maxX IS NULL OR :maxY IS NULL) + OR ST_Intersects(r.geom, ST_MakeEnvelope(:minX, :minY, :maxX, :maxY, 4326)) + ORDER BY r.layer_name + """, + nativeQuery = true, + ) + fun findAllByOrderByLayerName( + zoom: Int?, + minX: Double?, + minY: Double?, + maxX: Double?, + maxY: Double?, + withGeometry: Boolean, + ): List + @Query( value = """ @@ -14,6 +69,4 @@ interface IDBRegulatoryAreaRepository : JpaRepository """, ) fun findAllIdsByGeom(geometry: Geometry): List - - fun findAllByOrderByLayerName(): List } diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/amps/GetAllAMPsUTest.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/amps/GetAllAMPsUTest.kt index 9f26c3d6ce..a9db1418ad 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/amps/GetAllAMPsUTest.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/amps/GetAllAMPsUTest.kt @@ -19,10 +19,10 @@ class GetAllAMPsUTest { fun `execute should return all amps`(log: CapturedOutput) { // Given val expectedAmps = listOf(anAmp(), anAmp()) - given(ampRepository.findAll()).willReturn(expectedAmps) + given(ampRepository.findAll(false)).willReturn(expectedAmps) // When - val amps = getAllAMPs.execute() + val amps = getAllAMPs.execute(false) // Then assertThat(amps).isEqualTo(expectedAmps) diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/regulatoryAreas/GetAllRegulatoryAreasUTest.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/regulatoryAreas/GetAllRegulatoryAreasUTest.kt index 6a9c0687c4..234ab38b57 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/regulatoryAreas/GetAllRegulatoryAreasUTest.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/regulatoryAreas/GetAllRegulatoryAreasUTest.kt @@ -19,10 +19,10 @@ class GetAllRegulatoryAreasUTest { fun `execute should return all regulatory areas`(log: CapturedOutput) { // Given val expectedRegulatoryAreas = listOf(RegulatoryAreaFixture.aRegulatoryArea()) - given(regulatoryAreaRepository.findAll()).willReturn(expectedRegulatoryAreas) + given(regulatoryAreaRepository.findAll(false)).willReturn(expectedRegulatoryAreas) // When - val regulatoryAreas = getAllRegulatoryAreas.execute() + val regulatoryAreas = getAllRegulatoryAreas.execute(false) // Then assertThat(expectedRegulatoryAreas).isEqualTo(regulatoryAreas) diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/AmpsITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/AmpsITests.kt index 99e49a134b..3d31afbf7a 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/AmpsITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/AmpsITests.kt @@ -4,6 +4,8 @@ import com.nhaarman.mockitokotlin2.given import fr.gouv.cacem.monitorenv.config.MapperConfiguration import fr.gouv.cacem.monitorenv.config.SentryConfig import fr.gouv.cacem.monitorenv.domain.entities.amp.AMPEntity +import fr.gouv.cacem.monitorenv.domain.use_cases.amps.GetAMPById +import fr.gouv.cacem.monitorenv.domain.use_cases.amps.GetAMPsByIds import fr.gouv.cacem.monitorenv.domain.use_cases.amps.GetAllAMPs import org.hamcrest.Matchers.equalTo import org.junit.jupiter.api.Test @@ -29,6 +31,12 @@ class AmpsITests { @MockitoBean private lateinit var getAllAMPs: GetAllAMPs + @MockitoBean + private lateinit var getAMPsByIds: GetAMPsByIds + + @MockitoBean + private lateinit var getAMPById: GetAMPById + @Test fun `should return AMPs as json`() { // Given @@ -46,11 +54,11 @@ class AmpsITests { type = "mon type", urlLegicem = "mon url legicem", ) - given(getAllAMPs.execute()).willReturn(listOf(amp)) + given(getAllAMPs.execute(false)).willReturn(listOf(amp)) // When mockMvc - .perform(get("/bff/v1/amps")) + .perform(get("/bff/v1/amps?withGeometry=false")) // Then .andExpect(status().isOk) .andExpect(jsonPath("$[0].id", equalTo(amp.id))) diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/RegulatoryAreasITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/RegulatoryAreasITests.kt index bb6bba4ad9..d20aa85a5c 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/RegulatoryAreasITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/RegulatoryAreasITests.kt @@ -5,6 +5,7 @@ import fr.gouv.cacem.monitorenv.config.SentryConfig import fr.gouv.cacem.monitorenv.domain.entities.regulatoryArea.RegulatoryAreaEntity import fr.gouv.cacem.monitorenv.domain.use_cases.regulatoryAreas.GetAllRegulatoryAreas import fr.gouv.cacem.monitorenv.domain.use_cases.regulatoryAreas.GetRegulatoryAreaById +import fr.gouv.cacem.monitorenv.domain.use_cases.regulatoryAreas.GetRegulatoryAreasByIds import fr.gouv.cacem.monitorenv.domain.use_cases.tags.fixtures.TagFixture.Companion.aTag import fr.gouv.cacem.monitorenv.domain.use_cases.themes.fixtures.ThemeFixture.Companion.aTheme import org.hamcrest.Matchers.equalTo @@ -39,6 +40,9 @@ class RegulatoryAreasITests { @MockitoBean private lateinit var getRegulatoryAreaById: GetRegulatoryAreaById + @MockitoBean + private lateinit var getRegulatoryAreasByIds: GetRegulatoryAreasByIds + private val wktReader = WKTReader() private val multipolygonString = @@ -74,11 +78,11 @@ class RegulatoryAreasITests { dateFin = "2035-07-01", temporalite = "temporaire", ) - given(getAllRegulatoryAreas.execute()).willReturn(listOf(regulatoryArea)) + given(getAllRegulatoryAreas.execute(false)).willReturn(listOf(regulatoryArea)) // When mockMvc - .perform(get("/bff/v1/regulatory")) + .perform(get("/bff/v1/regulatory?withGeometry=false")) // Then .andDo(MockMvcResultHandlers.print()) .andExpect(status().isOk) diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaAMPRepositoryTests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaAMPRepositoryTests.kt index b96d81a5e6..818a0b7ee7 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaAMPRepositoryTests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaAMPRepositoryTests.kt @@ -15,7 +15,7 @@ class JpaAMPRepositoryTests : AbstractDBTests() { @Transactional fun `findAll Should return all amps`() { // When - val amps = jpaAMPRepository.findAll() + val amps = jpaAMPRepository.findAll(false) assertThat(amps).hasSize(20) } diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaRegulatoryAreaRepositoryITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaRegulatoryAreaRepositoryITests.kt index 132f9d3710..4e31fd87c1 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaRegulatoryAreaRepositoryITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaRegulatoryAreaRepositoryITests.kt @@ -20,7 +20,7 @@ class JpaRegulatoryAreaRepositoryITests : AbstractDBTests() { @Transactional fun `findAll Should return all regulatoryAreas`() { // When - val regulatoryAreas = jpaRegulatoryAreasRepository.findAll() + val regulatoryAreas = jpaRegulatoryAreasRepository.findAll(false) assertThat(regulatoryAreas).hasSize(13) } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index efd75f4f64..bfbe246f8f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -133,29 +133,29 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", - "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", - "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.4", - "@babel/types": "^7.28.4", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -172,13 +172,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -216,17 +216,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", - "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.3", + "@babel/traverse": "^7.28.5", "semver": "^6.3.1" }, "engines": { @@ -237,13 +237,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { @@ -279,13 +279,13 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -399,9 +399,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -444,12 +444,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.4" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -459,13 +459,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -867,9 +867,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", - "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -950,13 +950,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1044,9 +1044,9 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1137,9 +1137,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1199,15 +1199,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1344,9 +1344,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1657,13 +1657,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", - "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" @@ -1739,16 +1739,16 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", - "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.0", + "@babel/compat-data": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", @@ -1761,42 +1761,42 @@ "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-block-scoping": "^7.28.5", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regenerator": "^7.28.4", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -1837,14 +1837,14 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", - "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", "@babel/plugin-transform-react-jsx": "^7.27.1", "@babel/plugin-transform-react-jsx-development": "^7.27.1", "@babel/plugin-transform-react-pure-annotations": "^7.27.1" @@ -1857,16 +1857,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", - "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.27.1" + "@babel/plugin-transform-typescript": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1911,17 +1911,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { @@ -1929,13 +1929,13 @@ } }, "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2005,9 +2005,9 @@ } }, "node_modules/@emnapi/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", - "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.6.0.tgz", + "integrity": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==", "license": "MIT", "optional": true, "dependencies": { @@ -2016,9 +2016,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", - "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.6.0.tgz", + "integrity": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==", "license": "MIT", "optional": true, "dependencies": { @@ -2057,9 +2057,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", - "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", "cpu": [ "ppc64" ], @@ -2074,9 +2074,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", - "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", "cpu": [ "arm" ], @@ -2091,9 +2091,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", - "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", "cpu": [ "arm64" ], @@ -2108,9 +2108,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", - "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", "cpu": [ "x64" ], @@ -2125,9 +2125,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", - "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", "cpu": [ "arm64" ], @@ -2142,9 +2142,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", - "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", "cpu": [ "x64" ], @@ -2159,9 +2159,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", - "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", "cpu": [ "arm64" ], @@ -2176,9 +2176,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", - "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", "cpu": [ "x64" ], @@ -2193,9 +2193,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", - "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", "cpu": [ "arm" ], @@ -2210,9 +2210,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", - "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", "cpu": [ "arm64" ], @@ -2227,9 +2227,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", - "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", "cpu": [ "ia32" ], @@ -2244,9 +2244,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", - "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", "cpu": [ "loong64" ], @@ -2261,9 +2261,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", - "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", "cpu": [ "mips64el" ], @@ -2278,9 +2278,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", - "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", "cpu": [ "ppc64" ], @@ -2295,9 +2295,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", - "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", "cpu": [ "riscv64" ], @@ -2312,9 +2312,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", - "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", "cpu": [ "s390x" ], @@ -2329,9 +2329,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", - "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", "cpu": [ "x64" ], @@ -2346,9 +2346,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", - "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", "cpu": [ "arm64" ], @@ -2363,9 +2363,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", - "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", "cpu": [ "x64" ], @@ -2380,9 +2380,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", - "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", "cpu": [ "arm64" ], @@ -2397,9 +2397,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", - "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", "cpu": [ "x64" ], @@ -2414,9 +2414,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", - "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", "cpu": [ "arm64" ], @@ -2431,9 +2431,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", - "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", "cpu": [ "x64" ], @@ -2448,9 +2448,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", - "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", "cpu": [ "arm64" ], @@ -2465,9 +2465,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", - "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", "cpu": [ "ia32" ], @@ -2482,9 +2482,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", - "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", "cpu": [ "x64" ], @@ -2518,9 +2518,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -3307,9 +3307,9 @@ } }, "node_modules/@jest/core/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4160,9 +4160,9 @@ } }, "node_modules/@petamoriken/float16": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.9.2.tgz", - "integrity": "sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.9.3.tgz", + "integrity": "sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==", "license": "MIT" }, "node_modules/@pkgjs/parseargs": { @@ -4509,9 +4509,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", - "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", + "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", "cpu": [ "arm" ], @@ -4523,9 +4523,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", - "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", + "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", "cpu": [ "arm64" ], @@ -4537,9 +4537,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", - "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", + "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", "cpu": [ "arm64" ], @@ -4551,9 +4551,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", - "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", + "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", "cpu": [ "x64" ], @@ -4565,9 +4565,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", - "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", + "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", "cpu": [ "arm64" ], @@ -4579,9 +4579,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", - "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", + "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", "cpu": [ "x64" ], @@ -4593,9 +4593,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", - "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", + "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", "cpu": [ "arm" ], @@ -4607,9 +4607,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", - "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", + "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", "cpu": [ "arm" ], @@ -4621,9 +4621,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", - "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", + "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", "cpu": [ "arm64" ], @@ -4635,9 +4635,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", - "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", + "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", "cpu": [ "arm64" ], @@ -4649,9 +4649,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", - "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", + "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", "cpu": [ "loong64" ], @@ -4663,9 +4663,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", - "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", + "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", "cpu": [ "ppc64" ], @@ -4677,9 +4677,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", - "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", + "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", "cpu": [ "riscv64" ], @@ -4691,9 +4691,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", - "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", + "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", "cpu": [ "riscv64" ], @@ -4705,9 +4705,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", - "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", + "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", "cpu": [ "s390x" ], @@ -4719,9 +4719,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", - "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", + "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", "cpu": [ "x64" ], @@ -4733,9 +4733,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", - "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", + "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", "cpu": [ "x64" ], @@ -4747,9 +4747,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", - "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", + "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", "cpu": [ "arm64" ], @@ -4761,9 +4761,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", - "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", + "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", "cpu": [ "arm64" ], @@ -4775,9 +4775,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", - "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", + "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", "cpu": [ "ia32" ], @@ -4789,9 +4789,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", - "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", + "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", "cpu": [ "x64" ], @@ -4803,9 +4803,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", - "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", + "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", "cpu": [ "x64" ], @@ -4823,9 +4823,9 @@ "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)" }, "node_modules/@rsuite/icons": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@rsuite/icons/-/icons-1.3.2.tgz", - "integrity": "sha512-3sOdZpPcVePwTCoWcHHIEg4rsjWp9ehwjC84SjvgyqNyEf/BJNVDm0+jDAGGbhOF0HiWYyfU10LwrwnDSAYltA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rsuite/icons/-/icons-1.4.0.tgz", + "integrity": "sha512-NUOKX/KNO8Qy0nCJ4XzHKRdp0ovUM7zZhvuelteNkdhwwtmc9R0Ap4TlW2q/74sYa1aVXjH1RF+d2EGRD8EOEA==", "license": "MIT", "dependencies": { "@rsuite/icon-font": "^4.1.0", @@ -6416,9 +6416,9 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.34", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", + "integrity": "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -6477,9 +6477,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -6639,9 +6639,9 @@ } }, "node_modules/@typescript-eslint/experimental-utils/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -6770,9 +6770,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -6809,9 +6809,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -7858,9 +7858,9 @@ "license": "MIT" }, "node_modules/axe-core": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", - "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", + "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", "dev": true, "license": "MPL-2.0", "engines": { @@ -8059,11 +8059,19 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", - "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.1.tgz", + "integrity": "sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } }, "node_modules/bare-fs": { "version": "2.3.5", @@ -8141,9 +8149,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.12.tgz", - "integrity": "sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==", + "version": "2.8.21", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.21.tgz", + "integrity": "sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -8262,9 +8270,9 @@ } }, "node_modules/browserslist": { - "version": "4.26.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", - "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", "funding": [ { "type": "opencollective", @@ -8281,11 +8289,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.9", - "caniuse-lite": "^1.0.30001746", - "electron-to-chromium": "^1.5.227", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" @@ -8442,9 +8450,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001748", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001748.tgz", - "integrity": "sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==", + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", "funding": [ { "type": "opencollective", @@ -8743,9 +8751,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "license": "MIT" }, "node_modules/color-convert": { @@ -8872,12 +8880,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", - "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", + "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", "license": "MIT", "dependencies": { - "browserslist": "^4.25.3" + "browserslist": "^4.26.3" }, "funding": { "type": "opencollective", @@ -8885,9 +8893,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.1.tgz", - "integrity": "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==", + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.46.0.tgz", + "integrity": "sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -9187,9 +9195,9 @@ "license": "MIT" }, "node_modules/cypress/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -9688,9 +9696,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.232", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.232.tgz", - "integrity": "sha512-ENirSe7wf8WzyPCibqKUG1Cg43cPaxH4wRR7AJsX7MCABCHBIOFqvaYODSLKUuZdraxUTHRE/0A2Aq8BYKEHOg==", + "version": "1.5.243", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.243.tgz", + "integrity": "sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g==", "license": "ISC" }, "node_modules/emittery": { @@ -9987,9 +9995,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", - "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -10000,32 +10008,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.10", - "@esbuild/android-arm": "0.25.10", - "@esbuild/android-arm64": "0.25.10", - "@esbuild/android-x64": "0.25.10", - "@esbuild/darwin-arm64": "0.25.10", - "@esbuild/darwin-x64": "0.25.10", - "@esbuild/freebsd-arm64": "0.25.10", - "@esbuild/freebsd-x64": "0.25.10", - "@esbuild/linux-arm": "0.25.10", - "@esbuild/linux-arm64": "0.25.10", - "@esbuild/linux-ia32": "0.25.10", - "@esbuild/linux-loong64": "0.25.10", - "@esbuild/linux-mips64el": "0.25.10", - "@esbuild/linux-ppc64": "0.25.10", - "@esbuild/linux-riscv64": "0.25.10", - "@esbuild/linux-s390x": "0.25.10", - "@esbuild/linux-x64": "0.25.10", - "@esbuild/netbsd-arm64": "0.25.10", - "@esbuild/netbsd-x64": "0.25.10", - "@esbuild/openbsd-arm64": "0.25.10", - "@esbuild/openbsd-x64": "0.25.10", - "@esbuild/openharmony-arm64": "0.25.10", - "@esbuild/sunos-x64": "0.25.10", - "@esbuild/win32-arm64": "0.25.10", - "@esbuild/win32-ia32": "0.25.10", - "@esbuild/win32-x64": "0.25.10" + "@esbuild/aix-ppc64": "0.25.11", + "@esbuild/android-arm": "0.25.11", + "@esbuild/android-arm64": "0.25.11", + "@esbuild/android-x64": "0.25.11", + "@esbuild/darwin-arm64": "0.25.11", + "@esbuild/darwin-x64": "0.25.11", + "@esbuild/freebsd-arm64": "0.25.11", + "@esbuild/freebsd-x64": "0.25.11", + "@esbuild/linux-arm": "0.25.11", + "@esbuild/linux-arm64": "0.25.11", + "@esbuild/linux-ia32": "0.25.11", + "@esbuild/linux-loong64": "0.25.11", + "@esbuild/linux-mips64el": "0.25.11", + "@esbuild/linux-ppc64": "0.25.11", + "@esbuild/linux-riscv64": "0.25.11", + "@esbuild/linux-s390x": "0.25.11", + "@esbuild/linux-x64": "0.25.11", + "@esbuild/netbsd-arm64": "0.25.11", + "@esbuild/netbsd-x64": "0.25.11", + "@esbuild/openbsd-arm64": "0.25.11", + "@esbuild/openbsd-x64": "0.25.11", + "@esbuild/openharmony-arm64": "0.25.11", + "@esbuild/sunos-x64": "0.25.11", + "@esbuild/win32-arm64": "0.25.11", + "@esbuild/win32-ia32": "0.25.11", + "@esbuild/win32-x64": "0.25.11" } }, "node_modules/escalade": { @@ -11843,11 +11851,11 @@ "peer": true }, "node_modules/glob/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -12335,9 +12343,9 @@ "license": "MIT" }, "node_modules/immer": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.3.tgz", - "integrity": "sha512-tmjF/k8QDKydUlm3mZU+tjM6zeq9/fFpPqH9SzWmBnVVKsPBg/V66qsMwb3/Bo90cgUN+ghdVBess+hPsxUyRw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", "license": "MIT", "funding": { "type": "opencollective", @@ -13078,9 +13086,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -13598,9 +13606,9 @@ } }, "node_modules/jest-circus/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -14707,9 +14715,9 @@ } }, "node_modules/jest-resolve-dependencies/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -15321,9 +15329,9 @@ } }, "node_modules/jest-runtime/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -15523,9 +15531,9 @@ "license": "MIT" }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -16339,9 +16347,9 @@ } }, "node_modules/lint-staged/node_modules/emoji-regex": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", - "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, @@ -16720,13 +16728,17 @@ } }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "license": "MIT", "peer": true, "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -16916,9 +16928,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -17301,9 +17313,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", - "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, "node_modules/normalize-path": { @@ -18740,13 +18752,13 @@ } }, "node_modules/react-router-dom": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.3.tgz", - "integrity": "sha512-1QSbA0TGGFKTAc/aWjpfW/zoEukYfU4dc1dLkT/vvf54JoGMkW+fNA+3oyo2gWVW1GM7BxjJVHz5GnPJv40rvg==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.5.tgz", + "integrity": "sha512-mkEmq/K8tKN63Ae2M7Xgz3c9l9YNbY+NHH6NNeUmLA3kDkhKXRsNb/ZpxaEunvGo2/3YXdk5EJU3Hxp3ocaBPw==", "license": "MIT", "peer": true, "dependencies": { - "react-router": "7.9.3" + "react-router": "7.9.5" }, "engines": { "node": ">=20.0.0" @@ -18757,9 +18769,9 @@ } }, "node_modules/react-router-dom/node_modules/react-router": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.3.tgz", - "integrity": "sha512-4o2iWCFIwhI/eYAIL43+cjORXYn/aRQPgtFRRZb3VzoyQ5Uej0Bmqj7437L97N9NJW4wnicSwLOLS+yCXfAPgg==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.5.tgz", + "integrity": "sha512-JmxqrnBZ6E9hWmf02jzNn9Jm3UqyeimyiwzD69NjxGySG6lIz/1LVPsoTCwN7NBX2XjCEa1LIX5EMz1j2b6u6A==", "license": "MIT", "peer": true, "dependencies": { @@ -19049,12 +19061,12 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -19234,9 +19246,9 @@ } }, "node_modules/rollup": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", - "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", + "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", "dev": true, "license": "MIT", "dependencies": { @@ -19250,28 +19262,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.4", - "@rollup/rollup-android-arm64": "4.52.4", - "@rollup/rollup-darwin-arm64": "4.52.4", - "@rollup/rollup-darwin-x64": "4.52.4", - "@rollup/rollup-freebsd-arm64": "4.52.4", - "@rollup/rollup-freebsd-x64": "4.52.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", - "@rollup/rollup-linux-arm-musleabihf": "4.52.4", - "@rollup/rollup-linux-arm64-gnu": "4.52.4", - "@rollup/rollup-linux-arm64-musl": "4.52.4", - "@rollup/rollup-linux-loong64-gnu": "4.52.4", - "@rollup/rollup-linux-ppc64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-musl": "4.52.4", - "@rollup/rollup-linux-s390x-gnu": "4.52.4", - "@rollup/rollup-linux-x64-gnu": "4.52.4", - "@rollup/rollup-linux-x64-musl": "4.52.4", - "@rollup/rollup-openharmony-arm64": "4.52.4", - "@rollup/rollup-win32-arm64-msvc": "4.52.4", - "@rollup/rollup-win32-ia32-msvc": "4.52.4", - "@rollup/rollup-win32-x64-gnu": "4.52.4", - "@rollup/rollup-win32-x64-msvc": "4.52.4", + "@rollup/rollup-android-arm-eabi": "4.52.5", + "@rollup/rollup-android-arm64": "4.52.5", + "@rollup/rollup-darwin-arm64": "4.52.5", + "@rollup/rollup-darwin-x64": "4.52.5", + "@rollup/rollup-freebsd-arm64": "4.52.5", + "@rollup/rollup-freebsd-x64": "4.52.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", + "@rollup/rollup-linux-arm-musleabihf": "4.52.5", + "@rollup/rollup-linux-arm64-gnu": "4.52.5", + "@rollup/rollup-linux-arm64-musl": "4.52.5", + "@rollup/rollup-linux-loong64-gnu": "4.52.5", + "@rollup/rollup-linux-ppc64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-musl": "4.52.5", + "@rollup/rollup-linux-s390x-gnu": "4.52.5", + "@rollup/rollup-linux-x64-gnu": "4.52.5", + "@rollup/rollup-linux-x64-musl": "4.52.5", + "@rollup/rollup-openharmony-arm64": "4.52.5", + "@rollup/rollup-win32-arm64-msvc": "4.52.5", + "@rollup/rollup-win32-ia32-msvc": "4.52.5", + "@rollup/rollup-win32-x64-gnu": "4.52.5", + "@rollup/rollup-win32-x64-msvc": "4.52.5", "fsevents": "~2.3.2" } }, @@ -19557,9 +19569,9 @@ } }, "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", "license": "MIT" }, "node_modules/set-function-length": { @@ -20912,9 +20924,9 @@ } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -21460,9 +21472,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", "funding": [ { "type": "opencollective", @@ -21867,9 +21879,9 @@ } }, "node_modules/webpack": { - "version": "5.102.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.0.tgz", - "integrity": "sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==", + "version": "5.102.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", + "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", "license": "MIT", "peer": true, "dependencies": { @@ -21881,7 +21893,7 @@ "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", - "browserslist": "^4.24.5", + "browserslist": "^4.26.3", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", @@ -21893,8 +21905,8 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.2.3", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" diff --git a/frontend/src/api/ampsAPI.ts b/frontend/src/api/ampsAPI.ts index 8d552d7a2e..052ffaa296 100644 --- a/frontend/src/api/ampsAPI.ts +++ b/frontend/src/api/ampsAPI.ts @@ -1,7 +1,7 @@ import { getExtentOfLayersGroup } from '@features/layersSelector/utils/getExtentOfLayersGroup' import { FrontendApiError } from '@libs/FrontendApiError' -import { type EntityState, createEntityAdapter, createSelector, type EntityId } from '@reduxjs/toolkit' -import { boundingExtent, createEmpty } from 'ol/extent' +import { createEntityAdapter, createSelector, type EntityId, type EntityState } from '@reduxjs/toolkit' +import { boundingExtent, createEmpty, type Extent } from 'ol/extent' import { createCachedSelector } from 're-reselect' import { monitorenvPrivateApi } from './api' @@ -15,13 +15,19 @@ const initialState = AMPAdapter.getInitialState() const GET_AMP_ERROR_MESSAGE = "Nous n'avons pas pu récupérer les Zones AMP" +type AmpQueryOption = { + bbox?: Extent | undefined + withGeometry?: boolean + zoom?: number | undefined +} + export const ampsAPI = monitorenvPrivateApi.injectEndpoints({ endpoints: builder => ({ getAMP: builder.query({ query: id => `/v1/amps/${id}`, transformErrorResponse: response => new FrontendApiError(GET_AMP_ERROR_MESSAGE, response), transformResponse: (response: AMPFromAPI) => { - const bbox = boundingExtent(response.geom.coordinates.flat().flat() as Coordinate[]) + const bbox = boundingExtent((response.geom?.coordinates ?? []).flat().flat() as Coordinate[]) return { ...response, @@ -29,14 +35,17 @@ export const ampsAPI = monitorenvPrivateApi.injectEndpoints({ } } }), - getAMPs: builder.query, void>({ - query: () => `/v1/amps`, + getAMPs: builder.query, AmpQueryOption>({ + query: ({ bbox, withGeometry, zoom } = { bbox: undefined, withGeometry: false, zoom: undefined }) => + `/v1/amps?withGeometry=${withGeometry}${withGeometry && bbox ? `&bbox=${bbox}` : ''}${ + withGeometry && zoom ? `&zoom=${zoom}` : '' + }`, transformErrorResponse: response => new FrontendApiError(GET_AMP_ERROR_MESSAGE, response), transformResponse: (response: AMPFromAPI[]) => AMPAdapter.setAll( initialState, response.map(amp => { - const bbox = boundingExtent(amp.geom.coordinates.flat().flat() as Coordinate[]) + const bbox = boundingExtent((amp.geom?.coordinates ?? []).flat().flat() as Coordinate[]) return { ...amp, @@ -44,24 +53,39 @@ export const ampsAPI = monitorenvPrivateApi.injectEndpoints({ } }) ) + }), + getAmpsByIds: builder.query({ + query: ids => ({ body: ids, method: 'POST', url: '/v1/amps' }), + transformResponse: (response: AMP[]) => + response.map(amp => { + const bbox = boundingExtent((amp.geom?.coordinates ?? []).flat().flat() as Coordinate[]) + + return { + ...amp, + bbox + } + }) }) }) }) -export const { useGetAMPQuery, useGetAMPsQuery } = ampsAPI +export const { useGetAMPQuery, useGetAmpsByIdsQuery, useGetAMPsQuery } = ampsAPI -export const getAMPsIdsGroupedByName = createSelector([ampsAPI.endpoints.getAMPs.select()], ampsQuery => { - const ampIdsByName = ampsQuery.data?.ids.reduce((acc, id) => { - const amp = ampsQuery.data?.entities[id] - if (amp) { - acc[amp.name] = [...(acc[amp.name] ?? []), id] - } +export const getAMPsIdsGroupedByName = createSelector( + [ampsAPI.endpoints.getAMPs.select({ withGeometry: false })], + ampsQuery => { + const ampIdsByName = ampsQuery.data?.ids.reduce((acc, id) => { + const amp = ampsQuery.data?.entities[id] + if (amp) { + acc[amp.name] = [...(acc[amp.name] ?? []), id] + } - return acc - }, {} as Record) + return acc + }, {} as Record) - return ampIdsByName -}) + return ampIdsByName + } +) export const getAMPsIdsByGroupName = createCachedSelector( [getAMPsIdsGroupedByName, (_, groupName: string) => groupName], @@ -74,12 +98,14 @@ export const getNumberOfAMPByGroupName = createCachedSelector( )((_, groupName: string) => groupName) export const getAmpsByIds = createSelector( - [ampsAPI.endpoints.getAMPs.select(), (_, ids: number[]) => ids], + // FIXME: replace with endpoint findByIds + [ampsAPI.endpoints.getAMPs.select({ withGeometry: false }), (_, ids: number[]) => ids], ({ data }, ids) => Object.values(data?.entities ?? []).filter(amp => ids.includes(amp.id)) ) export const getExtentOfAMPLayersGroupByGroupName = createCachedSelector( - [ampsAPI.endpoints.getAMPs.select(), getAMPsIdsByGroupName], + // FIXME: replace with endpoint findByIds + [ampsAPI.endpoints.getAMPs.select({ withGeometry: false }), getAMPsIdsByGroupName], (ampsQuery, ampIdsByName) => { const amps = ampIdsByName?.map(id => ampsQuery.data?.entities[id]).filter((amp): amp is AMP => !!amp) if (amps) { diff --git a/frontend/src/api/regulatoryLayersAPI.ts b/frontend/src/api/regulatoryLayersAPI.ts index 2d60f78224..d565ca92f4 100644 --- a/frontend/src/api/regulatoryLayersAPI.ts +++ b/frontend/src/api/regulatoryLayersAPI.ts @@ -1,7 +1,7 @@ import { getExtentOfLayersGroup } from '@features/layersSelector/utils/getExtentOfLayersGroup' import { FrontendApiError } from '@libs/FrontendApiError' import { createEntityAdapter, createSelector, type EntityId, type EntityState } from '@reduxjs/toolkit' -import { boundingExtent, createEmpty } from 'ol/extent' +import { boundingExtent, createEmpty, type Extent } from 'ol/extent' import { createCachedSelector } from 're-reselect' import { monitorenvPrivateApi } from './api' @@ -21,13 +21,30 @@ const RegulatoryLayersAdapter = createEntityAdapter const regulatoryLayersInitialState = RegulatoryLayersAdapter.getInitialState() +type RegulatoryAreaQueryOption = { + bbox?: Extent | undefined + withGeometry?: boolean + zoom?: number | undefined +} export const regulatoryLayersAPI = monitorenvPrivateApi.injectEndpoints({ endpoints: builder => ({ + getRegulatoryAreasByIds: builder.query({ + query: ids => ({ body: ids, method: 'POST', url: '/v1/regulatory' }), + transformResponse: (response: RegulatoryLayerWithMetadataFromAPI[]) => + response.map(regulatoryArea => { + const bbox = boundingExtent((regulatoryArea.geom?.coordinates ?? []).flat().flat() as Coordinate[]) + + return { + ...regulatoryArea, + bbox + } + }) + }), getRegulatoryLayerById: builder.query({ query: id => `/v1/regulatory/${id}`, transformErrorResponse: response => new FrontendApiError(GET_REGULATORY_LAYER_ERROR_MESSAGE, response), transformResponse: (response: RegulatoryLayerWithMetadataFromAPI) => { - const bbox = boundingExtent(response.geom.coordinates.flat().flat() as Coordinate[]) + const bbox = boundingExtent((response.geom?.coordinates ?? []).flat().flat() as Coordinate[]) return { ...response, @@ -35,14 +52,17 @@ export const regulatoryLayersAPI = monitorenvPrivateApi.injectEndpoints({ } } }), - getRegulatoryLayers: builder.query, void>({ - query: () => `/v1/regulatory`, + getRegulatoryLayers: builder.query, RegulatoryAreaQueryOption>({ + query: ({ bbox, withGeometry, zoom } = { bbox: undefined, withGeometry: false, zoom: undefined }) => + `/v1/regulatory?withGeometry=${withGeometry}${withGeometry && bbox ? `&bbox=${bbox}` : ''}${ + withGeometry && zoom ? `&zoom=${zoom}` : '' + }`, transformErrorResponse: response => new FrontendApiError(GET_REGULATORY_LAYERS_ERROR_MESSAGE, response), transformResponse: (response: RegulatoryLayerWithMetadata[]) => RegulatoryLayersAdapter.setAll( regulatoryLayersInitialState, response.map(regulatoryLayer => { - const bbox = boundingExtent(regulatoryLayer.geom.coordinates.flat().flat() as Coordinate[]) + const bbox = boundingExtent((regulatoryLayer.geom?.coordinates ?? []).flat().flat() as Coordinate[]) return { ...regulatoryLayer, @@ -54,11 +74,12 @@ export const regulatoryLayersAPI = monitorenvPrivateApi.injectEndpoints({ }) }) -export const { useGetRegulatoryLayerByIdQuery, useGetRegulatoryLayersQuery } = regulatoryLayersAPI +export const { useGetRegulatoryAreasByIdsQuery, useGetRegulatoryLayerByIdQuery, useGetRegulatoryLayersQuery } = + regulatoryLayersAPI export const getSelectedRegulatoryLayers = createSelector( [ - regulatoryLayersAPI.endpoints.getRegulatoryLayers.select(), + regulatoryLayersAPI.endpoints.getRegulatoryLayers.select({ withGeometry: false }), (state: HomeRootState) => state.regulatory.selectedRegulatoryLayerIds ], (regulatoryLayers, selectedRegulatoryLayerIds) => { @@ -73,7 +94,7 @@ export const getSelectedRegulatoryLayers = createSelector( ) export const getRegulatoryLayersIdsGroupedByName = createSelector( - [regulatoryLayersAPI.endpoints.getRegulatoryLayers.select()], + [regulatoryLayersAPI.endpoints.getRegulatoryLayers.select({ withGeometry: false })], regulatoryLayers => { const regulatoryLayersIdsByName = {} const regulatoryLayersEntities = regulatoryLayers?.data?.entities @@ -104,12 +125,16 @@ export const getNumberOfRegulatoryLayerZonesByGroupName = createCachedSelector( )((_, name) => name) export const getRegulatoryAreasByIds = createSelector( - [regulatoryLayersAPI.endpoints.getRegulatoryLayers.select(), (_, ids: number[]) => ids], + [regulatoryLayersAPI.endpoints.getRegulatoryLayers.select({ withGeometry: false }), (_, ids: number[]) => ids], ({ data }, ids) => Object.values(data?.entities ?? []).filter(regulatoryArea => ids.includes(regulatoryArea.id)) ) export const getExtentOfRegulatoryLayersGroupByGroupName = createCachedSelector( - [regulatoryLayersAPI.endpoints.getRegulatoryLayers.select(), getRegulatoryLayersIdsByGroupName], + // FIXME: replace with endpoint findByIds/groupName + [ + regulatoryLayersAPI.endpoints.getRegulatoryLayers.select({ withGeometry: false }), + getRegulatoryLayersIdsByGroupName + ], (regulatoryLayersQuery, regulatoryLayerIdsByName) => { const amps = regulatoryLayerIdsByName ?.map(id => regulatoryLayersQuery.data?.entities[id]) diff --git a/frontend/src/api/vigilanceAreasAPI.ts b/frontend/src/api/vigilanceAreasAPI.ts index b27a78f02c..39749104fc 100644 --- a/frontend/src/api/vigilanceAreasAPI.ts +++ b/frontend/src/api/vigilanceAreasAPI.ts @@ -52,7 +52,7 @@ export const vigilanceAreasAPI = monitorenvPrivateApi.injectEndpoints({ }) ) }), - getVigilanceAreasByIds: build.query({ + getVigilanceAreasByIds: build.query({ providesTags: result => result ? [ @@ -60,7 +60,18 @@ export const vigilanceAreasAPI = monitorenvPrivateApi.injectEndpoints({ { id: 'LIST', type: 'VigilanceAreas' } ] : [{ id: 'LIST', type: 'VigilanceAreas' }], - query: ids => ({ body: ids, method: 'POST', url: '/v1/vigilance_areas' }) + query: ids => ({ body: ids, method: 'POST', url: '/v1/vigilance_areas' }), + transformResponse: (response: VigilanceArea.VigilanceAreaLayer[]) => + response.map(vigilanceAreaLayer => { + const bbox = vigilanceAreaLayer.geom?.coordinates + ? boundingExtent(vigilanceAreaLayer.geom?.coordinates?.flat().flat() as Coordinate[]) + : [] + + return { + ...vigilanceAreaLayer, + bbox + } + }) }), updateVigilanceArea: build.mutation({ diff --git a/frontend/src/domain/entities/AMPs.ts b/frontend/src/domain/entities/AMPs.ts index f94b91c708..100734e0a4 100644 --- a/frontend/src/domain/entities/AMPs.ts +++ b/frontend/src/domain/entities/AMPs.ts @@ -3,7 +3,7 @@ import type { Extent } from 'ol/extent' export type AMPFromAPI = { designation: string - geom: GeoJSON.MultiPolygon + geom: GeoJSON.MultiPolygon | undefined id: number name: string refReg: string | undefined diff --git a/frontend/src/domain/entities/regulatory.ts b/frontend/src/domain/entities/regulatory.ts index 21abc4ba73..4798b38d22 100644 --- a/frontend/src/domain/entities/regulatory.ts +++ b/frontend/src/domain/entities/regulatory.ts @@ -2,22 +2,14 @@ import type { TagFromAPI } from './tags' import type { ThemeFromAPI } from './themes' import type { GeoJSON } from '../types/GeoJSON' -export type RegulatoryLayerWithMetadataFromAPI = { - entityName: string +export type RegulatoryLayerWithMetadataFromAPI = RegulatoryLayerCompactFromAPI & { facade: string - geom: GeoJSON.MultiPolygon - id: number - layerName: string - refReg: string - tags: TagFromAPI[] - themes: ThemeFromAPI[] - type: string url: string } export type RegulatoryLayerCompactFromAPI = { entityName: string - geom: GeoJSON.MultiPolygon + geom: GeoJSON.MultiPolygon | undefined id: number layerName: string refReg: string diff --git a/frontend/src/domain/shared_slices/Global.ts b/frontend/src/domain/shared_slices/Global.ts index 6a3d6556a0..f388f42d86 100644 --- a/frontend/src/domain/shared_slices/Global.ts +++ b/frontend/src/domain/shared_slices/Global.ts @@ -212,8 +212,7 @@ const globalSlice = createSlice({ state.visibility.isMapToolVisible = action.payload }, setOpenedOverlay(state, action: PayloadAction) { - const featureId = action.payload - state.openedOverlayId = featureId + state.openedOverlayId = action.payload }, setOverlayCoordinates(state, action: PayloadAction) { const { name } = action.payload diff --git a/frontend/src/domain/shared_slices/Map.ts b/frontend/src/domain/shared_slices/Map.ts index 9e7108a704..6675d7c5b4 100644 --- a/frontend/src/domain/shared_slices/Map.ts +++ b/frontend/src/domain/shared_slices/Map.ts @@ -37,9 +37,16 @@ type MapSliceStateType = { isAreaSelected: boolean isolatedLayer: IsolatedLayerType | undefined locateOnMap: LocateOnMap | undefined + mapView: MapView selectedBaseLayer: BaseLayer zoomToCenter?: Coordinate } + +export type MapView = { + bbox: Extent | undefined + zoom: number | undefined +} + const initialState: MapSliceStateType = { coordinatesFormat: CoordinatesFormat.DEGREES_MINUTES_SECONDS, currentMapExtentTracker: undefined, @@ -48,6 +55,7 @@ const initialState: MapSliceStateType = { isAreaSelected: false, isolatedLayer: undefined, locateOnMap: undefined, + mapView: { bbox: undefined, zoom: undefined }, selectedBaseLayer: BaseLayer.LIGHT, zoomToCenter: undefined } @@ -107,6 +115,9 @@ const mapSlice = createSlice({ setLocateOnMap(state, action: PayloadAction) { state.locateOnMap = action.payload }, + setMapView(state, action: PayloadAction) { + state.mapView = action.payload + }, setZoomToCenter(state, action) { state.zoomToCenter = action.payload } @@ -124,5 +135,6 @@ export const { setFitToExtent, setIsolateMode, setLocateOnMap, + setMapView, setZoomToCenter } = mapActions diff --git a/frontend/src/features/Dashboard/components/DashboardForm/Amps/Layer.tsx b/frontend/src/features/Dashboard/components/DashboardForm/Amps/Layer.tsx index df95bb5bc9..37eacdbcc8 100644 --- a/frontend/src/features/Dashboard/components/DashboardForm/Amps/Layer.tsx +++ b/frontend/src/features/Dashboard/components/DashboardForm/Amps/Layer.tsx @@ -1,4 +1,4 @@ -import { useGetAMPsQuery } from '@api/ampsAPI' +import { useGetAMPQuery } from '@api/ampsAPI' import { StyledTransparentButton } from '@components/style' import { dashboardActions, getOpenedPanel } from '@features/Dashboard/slice' import { Dashboard } from '@features/Dashboard/types' @@ -25,11 +25,7 @@ export function Layer({ isPinned = false, isSelected, layerId }: AmpLayerProps) const openPanel = useAppSelector(state => getOpenedPanel(state.dashboard, Dashboard.Block.AMP)) const ref = createRef() - const { layer } = useGetAMPsQuery(undefined, { - selectFromResult: result => ({ - layer: result?.currentData?.entities[layerId] - }) - }) + const { data: layer } = useGetAMPQuery(layerId) const handleSelectZone = e => { e.stopPropagation() diff --git a/frontend/src/features/Dashboard/components/DashboardForm/Amps/index.tsx b/frontend/src/features/Dashboard/components/DashboardForm/Amps/index.tsx index bba25a7334..4fbad32410 100644 --- a/frontend/src/features/Dashboard/components/DashboardForm/Amps/index.tsx +++ b/frontend/src/features/Dashboard/components/DashboardForm/Amps/index.tsx @@ -38,16 +38,20 @@ export const Amps = forwardRef( r => r.name ) - const { selectedAmpByLayerName } = useGetAMPsQuery(undefined, { - selectFromResult: ({ data }) => ({ - selectedAmpByLayerName: groupBy( - Object.values(data?.entities ?? []) - .filter(amp => selectedAmpIds.includes(amp.id)) - .sort((a, b) => a.name.localeCompare(b.name)), - amp => amp.name - ) - }) - }) + // TODO: either send extend of layer OR findById + const { selectedAmpByLayerName } = useGetAMPsQuery( + { withGeometry: false }, + { + selectFromResult: ({ data }) => ({ + selectedAmpByLayerName: groupBy( + Object.values(data?.entities ?? []) + .filter(amp => selectedAmpIds.includes(amp.id)) + .sort((a, b) => a.name.localeCompare(b.name)), + amp => amp.name + ) + }) + } + ) useEffect(() => { if (isSelectedAccordionOpen) { diff --git a/frontend/src/features/Dashboard/components/DashboardForm/RegulatoryAreas/Layer.tsx b/frontend/src/features/Dashboard/components/DashboardForm/RegulatoryAreas/Layer.tsx index bd08298a82..8a5576fbf1 100644 --- a/frontend/src/features/Dashboard/components/DashboardForm/RegulatoryAreas/Layer.tsx +++ b/frontend/src/features/Dashboard/components/DashboardForm/RegulatoryAreas/Layer.tsx @@ -10,7 +10,7 @@ import { transformExtent } from 'ol/proj' import Projection from 'ol/proj/Projection' import { createRef } from 'react' -import { useGetRegulatoryLayersQuery } from '../../../../../api/regulatoryLayersAPI' +import { useGetRegulatoryLayerByIdQuery } from '../../../../../api/regulatoryLayersAPI' import { MonitorEnvLayers } from '../../../../../domain/entities/layers/constants' import { setFitToExtent } from '../../../../../domain/shared_slices/Map' import { useAppDispatch } from '../../../../../hooks/useAppDispatch' @@ -28,11 +28,7 @@ export function Layer({ isPinned = false, isSelected, layerId }: RegulatoryLayer const ref = createRef() - const { layer } = useGetRegulatoryLayersQuery(undefined, { - selectFromResult: result => ({ - layer: result?.currentData?.entities[layerId] - }) - }) + const { data: layer } = useGetRegulatoryLayerByIdQuery(layerId) const handleSelectZone = e => { e.stopPropagation() diff --git a/frontend/src/features/Dashboard/components/DashboardForm/RegulatoryAreas/index.tsx b/frontend/src/features/Dashboard/components/DashboardForm/RegulatoryAreas/index.tsx index b69c071df1..c84f23c288 100644 --- a/frontend/src/features/Dashboard/components/DashboardForm/RegulatoryAreas/index.tsx +++ b/frontend/src/features/Dashboard/components/DashboardForm/RegulatoryAreas/index.tsx @@ -47,16 +47,20 @@ export const RegulatoryAreas = forwardRef regulatory.layerName ) - const { selectedRegulatoryAreasByLayerName } = useGetRegulatoryLayersQuery(undefined, { - selectFromResult: ({ data }) => ({ - selectedRegulatoryAreasByLayerName: groupBy( - Object.values(data?.entities ?? []) - .filter(regulatory => selectedRegulatoryAreaIds.includes(regulatory.id)) - .sort((a, b) => a.layerName.localeCompare(b.layerName)), - regulatory => regulatory.layerName - ) - }) - }) + // FIXME: replace with endpoint findByIds/groupName + const { selectedRegulatoryAreasByLayerName } = useGetRegulatoryLayersQuery( + { withGeometry: false }, + { + selectFromResult: ({ data }) => ({ + selectedRegulatoryAreasByLayerName: groupBy( + Object.values(data?.entities ?? []) + .filter(regulatory => selectedRegulatoryAreaIds.includes(regulatory.id)) + .sort((a, b) => a.layerName.localeCompare(b.layerName)), + regulatory => regulatory.layerName + ) + }) + } + ) useEffect(() => { if (isSelectedAccordionOpen) { diff --git a/frontend/src/features/Dashboard/components/DashboardForm/VigilanceAreas/Panel/Amps.tsx b/frontend/src/features/Dashboard/components/DashboardForm/VigilanceAreas/Panel/Amps.tsx index 3dd0b1d0cb..67d9dd566f 100644 --- a/frontend/src/features/Dashboard/components/DashboardForm/VigilanceAreas/Panel/Amps.tsx +++ b/frontend/src/features/Dashboard/components/DashboardForm/VigilanceAreas/Panel/Amps.tsx @@ -19,7 +19,8 @@ import type { AMP } from 'domain/entities/AMPs' export function Amps({ ampIds }: { ampIds: number[] }) { const dispatch = useAppDispatch() - const { data: ampLayers } = useGetAMPsQuery() + // TODO: either send extend of layer OR findById + const { data: ampLayers } = useGetAMPsQuery({ withGeometry: false }) const amps = ampIds.map(amp => ampLayers?.entities[amp]) diff --git a/frontend/src/features/Dashboard/components/DashboardForm/VigilanceAreas/Panel/RegulatoryAreas.tsx b/frontend/src/features/Dashboard/components/DashboardForm/VigilanceAreas/Panel/RegulatoryAreas.tsx index 241391ccc2..1a4aa9fef5 100644 --- a/frontend/src/features/Dashboard/components/DashboardForm/VigilanceAreas/Panel/RegulatoryAreas.tsx +++ b/frontend/src/features/Dashboard/components/DashboardForm/VigilanceAreas/Panel/RegulatoryAreas.tsx @@ -1,4 +1,4 @@ -import { useGetRegulatoryLayersQuery } from '@api/regulatoryLayersAPI' +import { useGetRegulatoryAreasByIdsQuery } from '@api/regulatoryLayersAPI' import { dashboardActions, getOpenedPanel } from '@features/Dashboard/slice' import { Dashboard } from '@features/Dashboard/types' import { LayerLegend } from '@features/layersSelector/utils/LayerLegend.style' @@ -20,9 +20,7 @@ import type { RegulatoryLayerCompact } from 'domain/entities/regulatory' export function RegulatoryAreas({ regulatoryAreaIds }: { regulatoryAreaIds: number[] }) { const dispatch = useAppDispatch() - const { data: regulatoryLayers } = useGetRegulatoryLayersQuery() - - const regulatoryAreas = regulatoryAreaIds.map(regulatoryArea => regulatoryLayers?.entities[regulatoryArea]) + const { data: regulatoryAreas } = useGetRegulatoryAreasByIdsQuery(regulatoryAreaIds) const activeDashboardId = useAppSelector(state => state.dashboard.activeDashboardId) const regulatoryIdsToDisplay = useAppSelector(state => @@ -80,53 +78,52 @@ export function RegulatoryAreas({ regulatoryAreaIds }: { regulatoryAreaIds: numb )} Réglementations en lien - {regulatoryAreas && - regulatoryAreas.map(regulatoryArea => ( - - - - {regulatoryArea?.entityName} - + {regulatoryAreas?.map(regulatoryArea => ( + + + + {regulatoryArea?.entityName} + - - toggleMetadata(e, regulatoryArea?.id)} - title={ - isSubPanelOpened && openPanel.subPanel?.id === regulatoryArea?.id - ? 'Fermer la réglementation de la zone' - : 'Afficher la réglementation de la zone' - } - /> + + toggleMetadata(e, regulatoryArea?.id)} + title={ + isSubPanelOpened && openPanel.subPanel?.id === regulatoryArea?.id + ? 'Fermer la réglementation de la zone' + : 'Afficher la réglementation de la zone' + } + /> - showRegulatoryAreaLayer(e, regulatoryArea)} - title={ - regulatoryArea?.id && regulatoryIdsToDisplay?.includes(regulatoryArea?.id) - ? 'Cacher la zone' - : 'Afficher la zone' - } - /> - - - ))} + showRegulatoryAreaLayer(e, regulatoryArea)} + title={ + regulatoryArea?.id && regulatoryIdsToDisplay?.includes(regulatoryArea?.id) + ? 'Cacher la zone' + : 'Afficher la zone' + } + /> + + + ))} ) diff --git a/frontend/src/features/Dashboard/components/DashboardForm/components/AmpsPanel.tsx b/frontend/src/features/Dashboard/components/DashboardForm/components/AmpsPanel.tsx index 31cc4ebbf6..8f42e604ff 100644 --- a/frontend/src/features/Dashboard/components/DashboardForm/components/AmpsPanel.tsx +++ b/frontend/src/features/Dashboard/components/DashboardForm/components/AmpsPanel.tsx @@ -14,16 +14,19 @@ import { LayerLegend } from '@features/layersSelector/utils/LayerLegend.style' import { Accent, Icon, IconButton, THEME } from '@mtes-mct/monitor-ui' import { MonitorEnvLayers } from 'domain/entities/layers/constants' import { getTitle } from 'domain/entities/layers/utils' -import { forwardRef, type ComponentProps } from 'react' +import { type ComponentProps, forwardRef } from 'react' import styled from 'styled-components' export const AmpsPanel = forwardRef void } & ComponentProps<'div'>>( ({ layerId, onClose, ...props }, ref) => { - const { layer: ampMetadata } = useGetAMPsQuery(undefined, { - selectFromResult: result => ({ - layer: result?.currentData?.entities[layerId] - }) - }) + const { layer: ampMetadata } = useGetAMPsQuery( + { withGeometry: false }, + { + selectFromResult: result => ({ + layer: result?.currentData?.entities[layerId] + }) + } + ) return ( // eslint-disable-next-line react/jsx-props-no-spreading diff --git a/frontend/src/features/Dashboard/components/DashboardsList/Cells/RegulatoryAreasTagsCell.tsx b/frontend/src/features/Dashboard/components/DashboardsList/Cells/RegulatoryAreasTagsCell.tsx index d9f08f975a..fdb42ca9cc 100644 --- a/frontend/src/features/Dashboard/components/DashboardsList/Cells/RegulatoryAreasTagsCell.tsx +++ b/frontend/src/features/Dashboard/components/DashboardsList/Cells/RegulatoryAreasTagsCell.tsx @@ -2,7 +2,7 @@ import { useGetRegulatoryLayersQuery } from '@api/regulatoryLayersAPI' import { SubThemesOrSubTagsContainer, ThemesOrTagsContainer } from '@components/Table/style' export function RegulatoryAreasTagsCell({ regulatoryAreaIds }: { regulatoryAreaIds: number[] }) { - const { data: regulatoryAreas } = useGetRegulatoryLayersQuery() + const { data: regulatoryAreas } = useGetRegulatoryLayersQuery({ withGeometry: false }) if (!regulatoryAreas) { return null } diff --git a/frontend/src/features/Dashboard/components/DashboardsList/DashboardsTable.tsx b/frontend/src/features/Dashboard/components/DashboardsList/DashboardsTable.tsx index fb6ce838ba..621f59dd68 100644 --- a/frontend/src/features/Dashboard/components/DashboardsList/DashboardsTable.tsx +++ b/frontend/src/features/Dashboard/components/DashboardsList/DashboardsTable.tsx @@ -26,7 +26,7 @@ export function DashboardsTable({ dashboards, isFetching, isLoading }: Dashboard const { pathname } = useLocation() const legacyFirefoxOffset = pathname !== paths.sidewindow && isLegacyFirefox() ? -25 : 0 - const { data: regulatoryAreas } = useGetRegulatoryLayersQuery() + const { data: regulatoryAreas } = useGetRegulatoryLayersQuery({ withGeometry: false }) const { data: controlUnits } = useGetControlUnitsQuery() const columns = useMemo( diff --git a/frontend/src/features/Dashboard/components/Layers/ActiveDashboardLayer.tsx b/frontend/src/features/Dashboard/components/Layers/ActiveDashboardLayer.tsx index 60f17e52d0..efb59479c5 100644 --- a/frontend/src/features/Dashboard/components/Layers/ActiveDashboardLayer.tsx +++ b/frontend/src/features/Dashboard/components/Layers/ActiveDashboardLayer.tsx @@ -1,7 +1,7 @@ -import { useGetAMPsQuery } from '@api/ampsAPI' -import { useGetRegulatoryLayersQuery } from '@api/regulatoryLayersAPI' +import { useGetAmpsByIdsQuery } from '@api/ampsAPI' +import { useGetRegulatoryAreasByIdsQuery } from '@api/regulatoryLayersAPI' import { useGetReportingsByIdsQuery } from '@api/reportingsAPI' -import { useGetVigilanceAreasQuery } from '@api/vigilanceAreasAPI' +import { useGetVigilanceAreasByIdsQuery } from '@api/vigilanceAreasAPI' import { getDashboardById } from '@features/Dashboard/slice' import { getAMPFeature } from '@features/map/layers/AMP/AMPGeometryHelpers' import { getRegulatoryFeature } from '@features/map/layers/Regulatory/regulatoryGeometryHelpers' @@ -9,12 +9,13 @@ import { measurementStyle, measurementStyleWithCenter } from '@features/map/laye import { getReportingZoneFeature } from '@features/Reportings/components/ReportingLayer/Reporting/reportingsGeometryHelpers' import { getVigilanceAreaZoneFeature } from '@features/VigilanceArea/components/VigilanceAreaLayer/vigilanceAreaGeometryHelper' import { useAppSelector } from '@hooks/useAppSelector' +import { skipToken } from '@reduxjs/toolkit/query' import { getFeature } from '@utils/getFeature' import { Layers } from 'domain/entities/layers/constants' import { Feature } from 'ol' import VectorLayer from 'ol/layer/Vector' import VectorSource from 'ol/source/Vector' -import { useCallback, useEffect, useRef } from 'react' +import React, { useCallback, useEffect, useRef } from 'react' import { dashboardIcon, getDashboardStyle } from './style' import { Dashboard } from '../../types' @@ -33,17 +34,33 @@ export function ActiveDashboardLayer({ map }: BaseMapChildrenProps) { const mapFocus = useAppSelector(state => state.dashboard.mapFocus) const dashboard = useAppSelector(state => getDashboardById(state.dashboard, activeDashboardId)) - const { data: reportings } = useGetReportingsByIdsQuery(dashboard?.dashboard.reportingIds ?? [], { - skip: !dashboard - }) - const { data: regulatoryLayers } = useGetRegulatoryLayersQuery(undefined, { skip: !dashboard }) - const { data: ampLayers } = useGetAMPsQuery(undefined, { skip: !dashboard }) - const { data: vigilanceAreas } = useGetVigilanceAreasQuery(undefined, { skip: !dashboard }) const openPanel = dashboard?.openPanel const activeDashboard = dashboard?.dashboard const isLayerVisible = !!dashboard + const { data: reportings } = useGetReportingsByIdsQuery( + activeDashboard && activeDashboard.reportingIds.length > 0 ? activeDashboard.reportingIds : skipToken, + { + skip: !isLayerVisible + } + ) + const { data: regulatoryLayers } = useGetRegulatoryAreasByIdsQuery( + activeDashboard && activeDashboard.regulatoryAreaIds.length > 0 ? activeDashboard.regulatoryAreaIds : skipToken, + { + skip: !isLayerVisible + } + ) + const { data: ampLayers } = useGetAmpsByIdsQuery( + activeDashboard && activeDashboard.ampIds.length > 0 ? activeDashboard.ampIds : skipToken, + { skip: !dashboard } + ) + const { data: vigilanceAreas } = useGetVigilanceAreasByIdsQuery( + activeDashboard && activeDashboard.vigilanceAreaIds.length > 0 ? activeDashboard.vigilanceAreaIds : skipToken, + { + skip: !isLayerVisible + } + ) const metadataLayerId = useAppSelector(state => state.layersMetadata.metadataLayerId) const drawBorder = useCallback( @@ -73,12 +90,9 @@ export function ActiveDashboardLayer({ map }: BaseMapChildrenProps) { if (activeDashboard && !mapFocus) { // Regulatory Areas - if (regulatoryLayers?.entities) { - const regulatoryLayersIds = activeDashboard.regulatoryAreaIds - const features = regulatoryLayersIds.reduce((feats: Feature[], layerId) => { - const layer = regulatoryLayers.entities[layerId] - - if (layer && layer?.geom && layer?.geom?.coordinates.length > 0) { + if (regulatoryLayers) { + const features = regulatoryLayers.reduce((feats: Feature[], layer) => { + if (layer.geom && layer.geom?.coordinates.length > 0) { const feature = getRegulatoryFeature({ code: Dashboard.featuresCode.DASHBOARD_REGULATORY_AREAS, isolatedLayer, @@ -87,7 +101,7 @@ export function ActiveDashboardLayer({ map }: BaseMapChildrenProps) { if (!feature) { return feats } - drawBorder(layerId, feature, Dashboard.Block.REGULATORY_AREAS) + drawBorder(layer.id, feature, Dashboard.Block.REGULATORY_AREAS) feats.push(feature) } @@ -97,18 +111,15 @@ export function ActiveDashboardLayer({ map }: BaseMapChildrenProps) { } // AMP - if (ampLayers?.entities) { - const ampLayerIds = activeDashboard.ampIds - const features = ampLayerIds?.reduce((feats: Feature[], layerId) => { - const layer = ampLayers.entities[layerId] - - if (layer && layer?.geom && layer?.geom?.coordinates.length > 0) { + if (ampLayers) { + const features = ampLayers?.reduce((feats: Feature[], layer) => { + if (layer.geom && layer.geom?.coordinates.length > 0) { const feature = getAMPFeature({ code: Dashboard.featuresCode.DASHBOARD_AMP, isolatedLayer, layer }) if (!feature) { return feats } - drawBorder(layerId, feature, Dashboard.Block.AMP) + drawBorder(layer.id, feature, Dashboard.Block.AMP) feats.push(feature) } @@ -120,11 +131,9 @@ export function ActiveDashboardLayer({ map }: BaseMapChildrenProps) { } // Vigilance Areas - if (vigilanceAreas?.entities) { - const vigilanceAreaLayersIds = activeDashboard.vigilanceAreaIds - const features = vigilanceAreaLayersIds.reduce((feats: Feature[], layerId) => { - const layer = vigilanceAreas.entities[layerId] - if (layer && layer?.geom && layer?.geom?.coordinates.length > 0) { + if (vigilanceAreas) { + const features = vigilanceAreas.reduce((feats: Feature[], layer) => { + if (layer.geom && layer.geom?.coordinates.length > 0) { const feature = getVigilanceAreaZoneFeature( layer, Dashboard.featuresCode.DASHBOARD_VIGILANCE_AREAS, @@ -168,20 +177,16 @@ export function ActiveDashboardLayer({ map }: BaseMapChildrenProps) { }, [ activeDashboard, activeDashboardId, - ampLayers?.entities, - activeDashboard?.ampIds, - activeDashboard?.regulatoryAreaIds, - activeDashboard?.reportingIds, - activeDashboard?.vigilanceAreaIds, + ampLayers, + dashboard?.dashboard.geom, + displayGeometry, + drawBorder, + isolatedLayer, map, - regulatoryLayers, - vigilanceAreas?.entities, mapFocus, + regulatoryLayers, reportings, - dashboard?.dashboard.geom, - drawBorder, - displayGeometry, - isolatedLayer + vigilanceAreas ]) useEffect(() => { diff --git a/frontend/src/features/Dashboard/components/Layers/PreviewDashboardLayer.tsx b/frontend/src/features/Dashboard/components/Layers/PreviewDashboardLayer.tsx index 2f1a8da970..2c6e97af09 100644 --- a/frontend/src/features/Dashboard/components/Layers/PreviewDashboardLayer.tsx +++ b/frontend/src/features/Dashboard/components/Layers/PreviewDashboardLayer.tsx @@ -1,6 +1,6 @@ -import { useGetAMPsQuery } from '@api/ampsAPI' -import { useGetRegulatoryLayersQuery } from '@api/regulatoryLayersAPI' -import { useGetVigilanceAreasQuery } from '@api/vigilanceAreasAPI' +import { useGetAmpsByIdsQuery } from '@api/ampsAPI' +import { useGetRegulatoryAreasByIdsQuery } from '@api/regulatoryLayersAPI' +import { useGetVigilanceAreaQuery } from '@api/vigilanceAreasAPI' import { getDashboardById } from '@features/Dashboard/slice' import { Dashboard } from '@features/Dashboard/types' import { getAMPFeature } from '@features/map/layers/AMP/AMPGeometryHelpers' @@ -8,10 +8,11 @@ import { getRegulatoryFeature } from '@features/map/layers/Regulatory/regulatory import { getReportingZoneFeature } from '@features/Reportings/components/ReportingLayer/Reporting/reportingsGeometryHelpers' import { getVigilanceAreaZoneFeature } from '@features/VigilanceArea/components/VigilanceAreaLayer/vigilanceAreaGeometryHelper' import { useAppSelector } from '@hooks/useAppSelector' +import { skipToken } from '@reduxjs/toolkit/query' import { Layers } from 'domain/entities/layers/constants' import VectorLayer from 'ol/layer/Vector' import VectorSource from 'ol/source/Vector' -import { useCallback, useEffect, useRef } from 'react' +import React, { useCallback, useEffect, useMemo, useRef } from 'react' import { getDashboardStyle } from './style' @@ -40,9 +41,44 @@ export function DashboardPreviewLayer({ map }: BaseMapChildrenProps) { }, [openPanel] ) - const { data: regulatoryLayers } = useGetRegulatoryLayersQuery(undefined, { skip: !dashboard }) - const { data: ampLayers } = useGetAMPsQuery(undefined, { skip: !dashboard }) - const { data: vigilanceAreas } = useGetVigilanceAreasQuery(undefined, { skip: !dashboard }) + const regulatoryAreaIdsToDisplay = useMemo(() => { + let regulatoryAreaToDisplay = dashboard?.regulatoryIdsToDisplay ?? [] + + if (openPanel?.type !== Dashboard.Block.REGULATORY_AREAS) { + return [] + } + + if (openPanel?.type === Dashboard.Block.REGULATORY_AREAS && !regulatoryAreaToDisplay.includes(openPanel.id)) { + regulatoryAreaToDisplay = [...regulatoryAreaToDisplay, openPanel.id] + } + + return regulatoryAreaToDisplay + }, [dashboard?.regulatoryIdsToDisplay, openPanel?.id, openPanel?.type]) + + const { data: regulatoryLayers } = useGetRegulatoryAreasByIdsQuery(regulatoryAreaIdsToDisplay, { + skip: !isLayerVisible + }) + + const ampIdsToDisplay = useMemo(() => { + let ampToDisplay = dashboard?.ampIdsToDisplay ?? [] + if (openPanel?.type !== Dashboard.Block.AMP) { + return [] + } + if (openPanel?.type === Dashboard.Block.AMP && !ampToDisplay.includes(openPanel.id)) { + ampToDisplay = [...ampToDisplay, openPanel.id] + } + + return ampToDisplay + }, [dashboard?.ampIdsToDisplay, openPanel?.id, openPanel?.type]) + + const { data: ampLayers } = useGetAmpsByIdsQuery(ampIdsToDisplay, { + skip: !isLayerVisible + }) + const openPanelIsVigilanceArea = openPanel?.type === Dashboard.Block.VIGILANCE_AREAS + + const shouldFetchVigilanceArea = openPanel && openPanelIsVigilanceArea && isLayerVisible + + const { data: vigilanceArea } = useGetVigilanceAreaQuery(shouldFetchVigilanceArea ? openPanel.id : skipToken) const previewLayersVectorSourceRef = useRef(new VectorSource()) as React.MutableRefObject< VectorSource> @@ -64,14 +100,8 @@ export function DashboardPreviewLayer({ map }: BaseMapChildrenProps) { if (dashboard) { // Regulatory Areas - if (regulatoryLayers?.entities) { - let regulatoryAreaToDisplay = dashboard.regulatoryIdsToDisplay - - if (openPanel?.type === Dashboard.Block.REGULATORY_AREAS && !regulatoryAreaToDisplay.includes(openPanel.id)) { - regulatoryAreaToDisplay = [...regulatoryAreaToDisplay, openPanel.id] - } - const features = regulatoryAreaToDisplay.reduce((feats: Feature[], layerId) => { - const layer = regulatoryLayers.entities[layerId] + if (regulatoryLayers) { + const features = regulatoryLayers.reduce((feats: Feature[], layer) => { if (layer && layer?.geom && layer?.geom?.coordinates.length > 0) { const feature = getRegulatoryFeature({ code: Dashboard.featuresCode.DASHBOARD_REGULATORY_AREAS, @@ -82,7 +112,7 @@ export function DashboardPreviewLayer({ map }: BaseMapChildrenProps) { return feats } - drawBorder(layerId, feature, Dashboard.Block.REGULATORY_AREAS) + drawBorder(layer.id, feature, Dashboard.Block.REGULATORY_AREAS) feats.push(feature) } @@ -93,20 +123,14 @@ export function DashboardPreviewLayer({ map }: BaseMapChildrenProps) { } // AMP - if (ampLayers?.entities) { - let ampToDisplay = dashboard.ampIdsToDisplay - - if (openPanel?.type === Dashboard.Block.AMP && !ampToDisplay.includes(openPanel.id)) { - ampToDisplay = [...ampToDisplay, openPanel.id] - } - const features = ampToDisplay.reduce((feats: Feature[], layerId) => { - const layer = ampLayers.entities[layerId] - if (layer && layer?.geom && layer?.geom?.coordinates.length > 0) { + if (ampLayers) { + const features = ampLayers.reduce((feats: Feature[], layer) => { + if (layer?.geom && layer?.geom?.coordinates.length > 0) { const feature = getAMPFeature({ code: Dashboard.featuresCode.DASHBOARD_AMP, isolatedLayer, layer }) if (!feature) { return feats } - drawBorder(layerId, feature, Dashboard.Block.AMP) + drawBorder(layer.id, feature, Dashboard.Block.AMP) feats.push(feature) } @@ -117,12 +141,10 @@ export function DashboardPreviewLayer({ map }: BaseMapChildrenProps) { } // Vigilance Areas - const openPanelIsVigilanceArea = openPanel?.type === Dashboard.Block.VIGILANCE_AREAS - if (vigilanceAreas?.entities && openPanelIsVigilanceArea) { - const layer = vigilanceAreas.entities[openPanel?.id] - if (layer && layer?.geom && layer?.geom?.coordinates.length > 0) { + if (vigilanceArea) { + if (vigilanceArea && vigilanceArea?.geom && vigilanceArea?.geom?.coordinates.length > 0) { const feature = getVigilanceAreaZoneFeature( - layer, + vigilanceArea, Dashboard.featuresCode.DASHBOARD_VIGILANCE_AREAS, isolatedLayer ) @@ -142,16 +164,7 @@ export function DashboardPreviewLayer({ map }: BaseMapChildrenProps) { } } } - }, [ - ampLayers?.entities, - dashboard, - drawBorder, - map, - openPanel, - regulatoryLayers?.entities, - vigilanceAreas?.entities, - isolatedLayer - ]) + }, [ampLayers, dashboard, drawBorder, isolatedLayer, map, openPanelIsVigilanceArea, regulatoryLayers, vigilanceArea]) useEffect(() => { map.getLayers().push(previewLayersVectorLayerRef.current) diff --git a/frontend/src/features/Dashboard/hooks/useExportImages.tsx b/frontend/src/features/Dashboard/hooks/useExportImages.tsx index b9e53ae5dc..b28155a30c 100644 --- a/frontend/src/features/Dashboard/hooks/useExportImages.tsx +++ b/frontend/src/features/Dashboard/hooks/useExportImages.tsx @@ -110,8 +110,8 @@ export function useExportImages() { const activeDashboard = dashboard?.dashboard const backgroundMap = dashboard?.backgroundMap - const { data: regulatoryLayers } = useGetRegulatoryLayersQuery(undefined, { skip: !dashboard }) - const { data: ampLayers } = useGetAMPsQuery(undefined, { skip: !dashboard }) + const { data: regulatoryLayers } = useGetRegulatoryLayersQuery({ withGeometry: true }, { skip: !dashboard }) + const { data: ampLayers } = useGetAMPsQuery({ withGeometry: true }, { skip: !dashboard }) const { data: allVigilanceAreas } = useGetVigilanceAreasQuery(undefined, { skip: !dashboard }) const { data: vigilanceAreas } = useGetVigilanceAreasByIdsQuery(activeDashboard?.vigilanceAreaIds ?? [], { skip: !activeDashboard?.vigilanceAreaIds diff --git a/frontend/src/features/Dashboard/hooks/useGetFilteredDashboardsQuery.ts b/frontend/src/features/Dashboard/hooks/useGetFilteredDashboardsQuery.ts index 9ff02aede3..efb8c99836 100644 --- a/frontend/src/features/Dashboard/hooks/useGetFilteredDashboardsQuery.ts +++ b/frontend/src/features/Dashboard/hooks/useGetFilteredDashboardsQuery.ts @@ -13,7 +13,7 @@ export const useGetFilteredDashboardsQuery = (skip = false) => { const { controlUnits, regulatoryTags, seaFronts, specificPeriod, updatedAt } = useAppSelector( state => state.dashboardFilters.filters ) - const { data: regulatoryAreas } = useGetRegulatoryLayersQuery() + const { data: regulatoryAreas } = useGetRegulatoryLayersQuery({ withGeometry: false }) const { data: dashboards, diff --git a/frontend/src/features/Dashboard/useCases/selectDashboardOnMap.ts b/frontend/src/features/Dashboard/useCases/selectDashboardOnMap.ts index dfc07b86ca..1b81a7755f 100644 --- a/frontend/src/features/Dashboard/useCases/selectDashboardOnMap.ts +++ b/frontend/src/features/Dashboard/useCases/selectDashboardOnMap.ts @@ -15,32 +15,31 @@ export const selectDashboardOnMap = async dispatch => { // get dashboard datas try { - const { data: reportings } = await dispatch( - reportingsAPI.endpoints.getReportingsByIds.initiate(dashboard.reportingIds) - ) - - const { data: amps } = await dispatch(ampsAPI.endpoints.getAMPs.initiate()) + const { data: reportings } = + dashboard.reportingIds.length > 0 + ? await dispatch(reportingsAPI.endpoints.getReportingsByIds.initiate(dashboard.reportingIds)) + : { data: { entities: [] } } - const { data: regulatoryAreas } = await dispatch(regulatoryLayersAPI.endpoints.getRegulatoryLayers.initiate()) - const { data: vigilanceAreas } = await dispatch(vigilanceAreasAPI.endpoints.getVigilanceAreas.initiate()) + const { data: amps } = + dashboard.ampIds.length > 0 + ? await dispatch(ampsAPI.endpoints.getAmpsByIds.initiate(dashboard.ampIds)) + : { data: [] } - const filteredAmps = Object.values(amps?.entities ?? []).filter(amp => dashboard.ampIds.includes(amp.id)) - const filteredRegulatoryAreas = Object.values(regulatoryAreas?.entities ?? []).filter(regulatoryArea => - dashboard.regulatoryAreaIds.includes(regulatoryArea.id) - ) - const filteredReportings = Object.values(reportings?.entities ?? []).filter(reporting => - dashboard.reportingIds.includes(+reporting.id) - ) - const filteredVigilanceAreas = Object.values(vigilanceAreas?.entities ?? []).filter(vigilanceArea => - dashboard.vigilanceAreaIds.includes(vigilanceArea.id) - ) + const { data: regulatoryAreas } = + dashboard.regulatoryAreaIds.length > 0 + ? await dispatch(regulatoryLayersAPI.endpoints.getRegulatoryAreasByIds.initiate(dashboard.regulatoryAreaIds)) + : { data: [] } + const { data: vigilanceAreas } = + dashboard.vigilanceAreaIds.length > 0 + ? await dispatch(vigilanceAreasAPI.endpoints.getVigilanceAreasByIds.initiate(dashboard.vigilanceAreaIds)) + : { data: [] } dispatch( dashboardActions.setSelectedDashboardOnMap({ ...dashboard, - amps: filteredAmps, - regulatoryAreas: filteredRegulatoryAreas, - reportings: filteredReportings, - vigilanceAreas: filteredVigilanceAreas + amps: amps ?? [], + regulatoryAreas: regulatoryAreas ?? [], + reportings: Object.values(reportings?.entities ?? []), + vigilanceAreas: vigilanceAreas ?? [] }) ) } catch (error) { diff --git a/frontend/src/features/Dashboard/utils.tsx b/frontend/src/features/Dashboard/utils.tsx index 34b9f1fb3a..a88d11bb40 100644 --- a/frontend/src/features/Dashboard/utils.tsx +++ b/frontend/src/features/Dashboard/utils.tsx @@ -26,8 +26,10 @@ export async function populateExtractAreaFromApi( dispatch: ThunkDispatch, extractedAreaFromApi: Dashboard.ExtractedAreaFromApi ): Promise { - const { data: regulatoryLayers } = await dispatch(regulatoryLayersAPI.endpoints.getRegulatoryLayers.initiate()) - const { data: ampLayers } = await dispatch(ampsAPI.endpoints.getAMPs.initiate()) + const { data: regulatoryLayers } = await dispatch( + regulatoryLayersAPI.endpoints.getRegulatoryLayers.initiate({ withGeometry: false }) + ) + const { data: ampLayers } = await dispatch(ampsAPI.endpoints.getAMPs.initiate({ withGeometry: false })) const { data: vigilanceAreas } = await dispatch(vigilanceAreasAPI.endpoints.getVigilanceAreas.initiate()) const { data: reportings } = await dispatch( reportingsAPI.endpoints.getReportingsByIds.initiate(extractedAreaFromApi.reportingIds) diff --git a/frontend/src/features/LocalizedArea/components/LocalizedAreaPanel/index.tsx b/frontend/src/features/LocalizedArea/components/LocalizedAreaPanel/index.tsx index f978df20a2..1633817e1e 100644 --- a/frontend/src/features/LocalizedArea/components/LocalizedAreaPanel/index.tsx +++ b/frontend/src/features/LocalizedArea/components/LocalizedAreaPanel/index.tsx @@ -18,11 +18,14 @@ export function LocalizedAreaPanel({ localizedArea }: { localizedArea?: Localize const dispatch = useAppDispatch() const { metadataPanelIsOpen } = useAppSelector(state => state.layersMetadata) - const { amps } = useGetAMPsQuery(undefined, { - selectFromResult: ({ data }) => ({ - amps: Object.values(data?.entities ?? []).filter(amp => localizedArea?.ampIds?.includes(amp.id)) - }) - }) + const { amps } = useGetAMPsQuery( + { withGeometry: false }, + { + selectFromResult: ({ data }) => ({ + amps: Object.values(data?.entities ?? []).filter(amp => localizedArea?.ampIds?.includes(amp.id)) + }) + } + ) const { controlUnits } = useGetControlUnitsQuery(undefined, { selectFromResult: ({ data }) => ({ controlUnits: data?.filter(controlUnit => localizedArea?.controlUnitIds?.includes(controlUnit.id)) @@ -61,6 +64,7 @@ export function LocalizedAreaPanel({ localizedArea }: { localizedArea?: Localize ) } + const Wrapper = styled.div<{ $regulatoryMetadataPanelIsOpen: boolean }>` border-radius: 2px; width: 400px; diff --git a/frontend/src/features/VigilanceArea/components/VigilanceAreaForm/AddAMPs/AMPList.tsx b/frontend/src/features/VigilanceArea/components/VigilanceAreaForm/AddAMPs/AMPList.tsx index 11a6df32d1..8db7d0e228 100644 --- a/frontend/src/features/VigilanceArea/components/VigilanceAreaForm/AddAMPs/AMPList.tsx +++ b/frontend/src/features/VigilanceArea/components/VigilanceAreaForm/AddAMPs/AMPList.tsx @@ -6,8 +6,9 @@ type AMPListProps = { isReadOnly?: boolean linkedAMPs: number[] } + export function AMPList({ isReadOnly = false, linkedAMPs }: AMPListProps) { - const { data: AMPLayers } = useGetAMPsQuery() + const { data: AMPLayers } = useGetAMPsQuery({ withGeometry: false }) const linkAMPLayers = linkedAMPs .map(ampId => AMPLayers?.entities[ampId]) .filter(amp => !!amp) diff --git a/frontend/src/features/VigilanceArea/components/VigilanceAreaForm/AddRegulatoryAreas/RegulatoryAreas.tsx b/frontend/src/features/VigilanceArea/components/VigilanceAreaForm/AddRegulatoryAreas/RegulatoryAreas.tsx index 4f5926b724..1f431723a9 100644 --- a/frontend/src/features/VigilanceArea/components/VigilanceAreaForm/AddRegulatoryAreas/RegulatoryAreas.tsx +++ b/frontend/src/features/VigilanceArea/components/VigilanceAreaForm/AddRegulatoryAreas/RegulatoryAreas.tsx @@ -6,8 +6,9 @@ type RegulatoryAreasProps = { isReadOnly?: boolean linkedRegulatoryAreas: number[] | undefined } + export function RegulatoryAreas({ isReadOnly = false, linkedRegulatoryAreas }: RegulatoryAreasProps) { - const { data: regulatoryLayers } = useGetRegulatoryLayersQuery() + const { data: regulatoryLayers } = useGetRegulatoryLayersQuery({ withGeometry: false }) const regulatoryAreas = linkedRegulatoryAreas ?.map(regulatoryArea => regulatoryLayers?.entities[regulatoryArea]) .filter(regulatoryArea => !!regulatoryArea) diff --git a/frontend/src/features/VigilanceArea/components/VigilanceAreaLayer/EditingVigilanceAreaLayer.tsx b/frontend/src/features/VigilanceArea/components/VigilanceAreaLayer/EditingVigilanceAreaLayer.tsx index cefd230a82..49fa18ca91 100644 --- a/frontend/src/features/VigilanceArea/components/VigilanceAreaLayer/EditingVigilanceAreaLayer.tsx +++ b/frontend/src/features/VigilanceArea/components/VigilanceAreaLayer/EditingVigilanceAreaLayer.tsx @@ -10,7 +10,7 @@ import { useAppSelector } from '@hooks/useAppSelector' import { Layers } from 'domain/entities/layers/constants' import VectorLayer from 'ol/layer/Vector' import VectorSource from 'ol/source/Vector' -import { useEffect, useMemo, useRef, type MutableRefObject } from 'react' +import { type MutableRefObject, useEffect, useMemo, useRef } from 'react' import { getVigilanceAreaLayerStyle } from './style' import { getFormattedGeomForFeature, getVigilanceAreaZoneFeature } from './vigilanceAreaGeometryHelper' @@ -27,6 +27,7 @@ export function EditingVigilanceAreaLayer({ map }: BaseMapChildrenProps) { const vigilanceAreaGeom = useAppSelector(state => state.vigilanceArea.geometry) const isolatedLayer = useAppSelector(state => state.map.isolatedLayer) + const { bbox, zoom } = useAppSelector(state => state.map.mapView) const isLayerVisible = !!editingVigilanceAreaId @@ -63,7 +64,14 @@ export function EditingVigilanceAreaLayer({ map }: BaseMapChildrenProps) { vectorLayerRef.current.name = Layers.VIGILANCE_AREA.code // Regulatory Areas Layers - const { data: regulatoryLayers } = useGetRegulatoryLayersQuery() + const { data: regulatoryLayers } = useGetRegulatoryLayersQuery( + { + bbox, + withGeometry: true, + zoom + }, + { skip: !isLayerVisible || !(bbox || zoom) } + ) const regulatoryAreasFeatures = useMemo(() => { if (!regulatoryLayers || regulatoryAreasToAdd.length === 0) { return [] @@ -100,7 +108,14 @@ export function EditingVigilanceAreaLayer({ map }: BaseMapChildrenProps) { regulatoryAreasVectorLayerRef.current.name = Layers.REGULATORY_AREAS_LINKED_TO_VIGILANCE_AREA.code // AMP Layer - const { data: ampLayers } = useGetAMPsQuery() + const { data: ampLayers } = useGetAMPsQuery( + { + bbox, + withGeometry: true, + zoom + }, + { skip: !isLayerVisible || !(bbox || zoom) } + ) const ampFeatures = useMemo(() => { if (!ampLayers || ampToAdd.length === 0) { return [] diff --git a/frontend/src/features/VigilanceArea/components/VigilanceAreaLayer/SelectedVigilanceAreaLayer.tsx b/frontend/src/features/VigilanceArea/components/VigilanceAreaLayer/SelectedVigilanceAreaLayer.tsx index 7546c06dee..430c4595e6 100644 --- a/frontend/src/features/VigilanceArea/components/VigilanceAreaLayer/SelectedVigilanceAreaLayer.tsx +++ b/frontend/src/features/VigilanceArea/components/VigilanceAreaLayer/SelectedVigilanceAreaLayer.tsx @@ -9,7 +9,7 @@ import { useAppSelector } from '@hooks/useAppSelector' import { Layers } from 'domain/entities/layers/constants' import VectorLayer from 'ol/layer/Vector' import VectorSource from 'ol/source/Vector' -import { useEffect, useMemo, useRef, type MutableRefObject } from 'react' +import { type MutableRefObject, useEffect, useMemo, useRef } from 'react' import { getVigilanceAreaLayerStyle } from './style' import { getVigilanceAreaZoneFeature } from './vigilanceAreaGeometryHelper' @@ -22,6 +22,7 @@ import type { Geometry } from 'ol/geom' export function SelectedVigilanceAreaLayer({ map }: BaseMapChildrenProps) { const selectedVigilanceAreaId = useAppSelector(state => state.vigilanceArea.selectedVigilanceAreaId) const editingVigilanceAreaId = useAppSelector(state => state.vigilanceArea.editingVigilanceAreaId) + const { bbox, zoom } = useAppSelector(state => state.map.mapView) const { selectedVigilanceArea } = useGetVigilanceAreasQuery(undefined, { selectFromResult: ({ data }) => ({ @@ -64,7 +65,14 @@ export function SelectedVigilanceAreaLayer({ map }: BaseMapChildrenProps) { !!selectedVigilanceAreaId && isLayerVisible - const { data: regulatoryLayers } = useGetRegulatoryLayersQuery() + const { data: regulatoryLayers } = useGetRegulatoryLayersQuery( + { + bbox, + withGeometry: true, + zoom + }, + { skip: !isRegulatoryLayerVisible || !(bbox || zoom) } + ) const regulatoryAreasFeatures = useMemo(() => { const linkedRegulatoryAreas = selectedVigilanceArea?.linkedRegulatoryAreas ?? [] @@ -118,7 +126,15 @@ export function SelectedVigilanceAreaLayer({ map }: BaseMapChildrenProps) { const isAMPLayerVisible = !!(ampIdsToBeDisplayed && ampIdsToBeDisplayed?.length > 0) && !!selectedVigilanceAreaId && isLayerVisible - const { data: ampLayers } = useGetAMPsQuery() + + const { data: ampLayers } = useGetAMPsQuery( + { + bbox, + withGeometry: true, + zoom + }, + { skip: !isAMPLayerVisible || !(bbox || zoom) } + ) const ampFeatures = useMemo(() => { const linkedAMPs = selectedVigilanceArea?.linkedAMPs ?? [] if (!ampLayers || linkedAMPs.length === 0) { diff --git a/frontend/src/features/layersSelector/index.tsx b/frontend/src/features/layersSelector/index.tsx index 71a2fd403f..aa8b75ece7 100644 --- a/frontend/src/features/layersSelector/index.tsx +++ b/frontend/src/features/layersSelector/index.tsx @@ -1,5 +1,3 @@ -import { useGetAMPsQuery } from '@api/ampsAPI' -import { useGetRegulatoryLayersQuery } from '@api/regulatoryLayersAPI' import { dashboardActions } from '@features/Dashboard/slice' import { LocalizedAreas } from '@features/LocalizedArea' import { NumberOfFilters } from '@features/map/shared/style' @@ -12,7 +10,7 @@ import { import { useAppDispatch } from '@hooks/useAppDispatch' import { useAppSelector } from '@hooks/useAppSelector' import { useMountTransition } from '@hooks/useMountTransition' -import { Accent, FulfillingBouncingCircleLoader, Icon, IconButton, Size, THEME } from '@mtes-mct/monitor-ui' +import { Accent, Icon, IconButton, Size } from '@mtes-mct/monitor-ui' import { layerSidebarActions } from 'domain/shared_slices/LayerSidebar' import styled from 'styled-components' @@ -48,9 +46,6 @@ export function LayersSidebar() { const isLinkingZonesToVigilanceArea = useAppSelector(state => getIsLinkingZonesToVigilanceArea(state)) const nbOfFiltersSetted = useAppSelector(state => state.vigilanceAreaFilters.nbOfFiltersSetted) - const regulatoryAreas = useGetRegulatoryLayersQuery() - const amps = useGetAMPsQuery() - const dispatch = useAppDispatch() const toggleLayerSidebar = () => { @@ -146,16 +141,16 @@ export function LayersSidebar() { )} - {(regulatoryAreas.isLoading || amps.isLoading) && ( - - - - Chargement des zones cartographiques ({regulatoryAreas.isLoading && 'Zones réglementaires'} - {regulatoryAreas.isLoading && amps.isLoading ? ' et ' : ''} - {amps.isLoading && 'Aires Marines Protégées'}) - - - )} + {/* {(regulatoryAreas.isLoading || amps.isLoading) && ( */} + {/* */} + {/* */} + {/* */} + {/* Chargement des zones cartographiques ({regulatoryAreas.isLoading && 'Zones réglementaires'} */} + {/* {regulatoryAreas.isLoading && amps.isLoading ? ' et ' : ''} */} + {/* {amps.isLoading && 'Aires Marines Protégées'}) */} + {/* */} + {/* */} + {/* )} */} ) } @@ -240,17 +235,3 @@ const Layers = styled.div` const SidebarLayersIcon = styled(IconButton)<{ $isVisible: boolean }>` ${p => (p.$isVisible ? '' : 'display: none;')} ` - -const SpinnerWrapper = styled.div<{ $isLayersSidebarVisible: boolean }>` - position: absolute; - top: 0; - left: ${props => (props.$isLayersSidebarVisible ? '460px' : '56px')}; - display: flex; - padding: 4px; -` -const Message = styled.div` - font-size: 14px; - font-weight: 900; - white-space: nowrap; - padding: 4px 4px 4px 8px; -` diff --git a/frontend/src/features/layersSelector/metadataPanel/ampMetadata/index.tsx b/frontend/src/features/layersSelector/metadataPanel/ampMetadata/index.tsx index cf32397151..65a889da41 100644 --- a/frontend/src/features/layersSelector/metadataPanel/ampMetadata/index.tsx +++ b/frontend/src/features/layersSelector/metadataPanel/ampMetadata/index.tsx @@ -9,7 +9,7 @@ import styled from 'styled-components' import { MonitorEnvLayers } from '../../../../domain/entities/layers/constants' import { LayerLegend } from '../../utils/LayerLegend.style' -import { Key, Value, Fields, Field, Zone, Body, NoValue } from '../MetadataPanel.style' +import { Body, Field, Fields, Key, NoValue, Value, Zone } from '../MetadataPanel.style' import { RegulatorySummary } from '../RegulatorySummary' import { closeMetadataPanel } from '../slice' @@ -19,12 +19,15 @@ export function AmpMetadata() { const dispatch = useAppDispatch() const { metadataLayerId, metadataPanelIsOpen } = useAppSelector(state => state.layersMetadata) - const { ampMetadata } = useGetAMPsQuery(undefined, { - pollingInterval: FOUR_HOURS, - selectFromResult: result => ({ - ampMetadata: metadataLayerId && result?.data?.entities[metadataLayerId] - }) - }) + const { ampMetadata } = useGetAMPsQuery( + { withGeometry: false }, + { + pollingInterval: FOUR_HOURS, + selectFromResult: result => ({ + ampMetadata: metadataLayerId && result?.data?.entities[metadataLayerId] + }) + } + ) const onCloseIconClicked = useCallback(() => { dispatch(closeMetadataPanel()) diff --git a/frontend/src/features/layersSelector/myAmps/MyAMPLayersList.tsx b/frontend/src/features/layersSelector/myAmps/MyAMPLayersList.tsx index e427663def..ed4455933e 100644 --- a/frontend/src/features/layersSelector/myAmps/MyAMPLayersList.tsx +++ b/frontend/src/features/layersSelector/myAmps/MyAMPLayersList.tsx @@ -15,8 +15,8 @@ export function AMPLayersList() { const myAmpsIsOpen = useAppSelector(state => state.layerSidebar.myAmpsIsOpen) const [totalNumberOfZones, setTotalNumberOfZones] = useState(0) - - const { currentData: amps, isLoading } = useGetAMPsQuery() + // TODO: either send extend of layer OR findById + const { currentData: amps, isLoading } = useGetAMPsQuery({ withGeometry: false }) const selectedAmps = useMemo( () => selectedAmpLayerIds.map(id => amps?.entities?.[id]).filter((layer): layer is AMP => !!layer), [amps, selectedAmpLayerIds] diff --git a/frontend/src/features/layersSelector/search/LayerFilters.tsx b/frontend/src/features/layersSelector/search/LayerFilters.tsx index e812288cb4..e207c07299 100644 --- a/frontend/src/features/layersSelector/search/LayerFilters.tsx +++ b/frontend/src/features/layersSelector/search/LayerFilters.tsx @@ -56,7 +56,7 @@ export function LayerFilters() { const filteredAmpTypes = useAppSelector(state => state.layerSearch.filteredAmpTypes) const filteredVigilanceAreaPeriod = useAppSelector(state => state.vigilanceAreaFilters.period) - const { data: amps } = useGetAMPsQuery() + const { data: amps } = useGetAMPsQuery({ withGeometry: false }) const ampTypes = useMemo(() => getAmpsAsOptions(amps ?? []), [amps]) const AMPCustomSearch = useMemo(() => new CustomSearch(ampTypes as Array