diff --git a/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts b/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts index d1fcc7324e7d1f04ccbfe26853abe92b210d76d6..0152a884d1e038ef7977d83c41455809590ece53 100644 --- a/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts +++ b/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts @@ -6,7 +6,7 @@ import { titreUrlGet } from '../../../business/utils/urls-get' import { EmailAdministration } from '../../../tools/api-mailjet/types' import { UserNotNull } from 'camino-common/src/roles' import { EtapesTypes } from 'camino-common/src/static/etapesTypes' -import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape' import { TitreId } from 'camino-common/src/validators/titres' import { TITRES_TYPES_IDS, TitreTypeId } from 'camino-common/src/static/titresTypes' @@ -14,7 +14,7 @@ import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes' import { getUtilisateursByTitreId } from '../../../database/queries/utilisateurs.queries' import { Pool } from 'pg' -const emailForAdministrationContentFormat = (titreTypeId: TitreTypeId, etapeNom: string, titreId: TitreId, user: DeepReadonly<UserNotNull>) => { +const emailForAdministrationContentFormat = (titreTypeId: TitreTypeId, etapeNom: string, titreId: TitreId, user: UserNotNull) => { const titreUrl = titreUrlGet(titreId) return ` @@ -34,7 +34,7 @@ export const emailsForAdministrationsGet = ( demarcheTypeId: string, titreId: TitreId, titreTypeId: TitreTypeId, - user: DeepReadonly<UserNotNull>, + user: UserNotNull, oldEtape?: Pick<ITitreEtape, 'statutId' | 'isBrouillon'> ): { subject: string; content: string; emails: string[] } | null => { if (!etape) { @@ -69,7 +69,7 @@ export const titreEtapeAdministrationsEmailsSend = async ( demarcheTypeId: DemarcheTypeId, titreId: TitreId, titreTypeId: TitreTypeId, - user: DeepReadonly<UserNotNull>, + user: UserNotNull, oldEtape?: ITitreEtape ): Promise<void> => { const emailsForAdministrations = emailsForAdministrationsGet(etape, demarcheTypeId, titreId, titreTypeId, user, oldEtape) diff --git a/packages/api/src/api/graphql/resolvers/_titre-etape.ts b/packages/api/src/api/graphql/resolvers/_titre-etape.ts index 6f99bb8421aed4bfe2dc017130a092761349aaf5..b935d33c951c5cb860c5820d9c9f15e4575eab19 100644 --- a/packages/api/src/api/graphql/resolvers/_titre-etape.ts +++ b/packages/api/src/api/graphql/resolvers/_titre-etape.ts @@ -5,7 +5,7 @@ import { titreEtapeHeritageContenuFind } from '../../../business/utils/titre-eta import { titreEtapesSortAscByOrdre, titreEtapesSortDescByOrdre } from '../../../business/utils/titre-etapes-sort' import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes' import { TitreTypeId } from 'camino-common/src/static/titresTypes' -import { DeepReadonly, getKeys, isNotNullNorUndefined, RecordPartial } from 'camino-common/src/typescript-tools' +import { getKeys, isNotNullNorUndefined, RecordPartial } from 'camino-common/src/typescript-tools' import { getSections, Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' import { ETAPE_HERITAGE_PROPS, isHeritageProps } from 'camino-common/src/heritage' import { EtapeTypeId, EtapesTypes } from 'camino-common/src/static/etapesTypes' @@ -82,7 +82,7 @@ const titreEtapeHeritageContenuBuild = ( titreEtapesFiltered.splice(0, 0, titreEtape) - const etapeSectionsDictionary = titreEtapesFiltered.reduce<RecordPartial<string, DeepReadonly<Section[]>>>((acc, e) => { + const etapeSectionsDictionary = titreEtapesFiltered.reduce<RecordPartial<string, Section[]>>((acc, e) => { acc[e.id] = getSections(titreTypeId, demarcheTypeId, e.typeId) return acc diff --git a/packages/api/src/api/rest/activites.ts b/packages/api/src/api/rest/activites.ts index 5be622bf213bfbecbef3966f731bec5bf80b3de2..16da6f62ae5141ae93f5a7463414087a0ca8712f 100644 --- a/packages/api/src/api/rest/activites.ts +++ b/packages/api/src/api/rest/activites.ts @@ -17,7 +17,7 @@ import { activiteDeleteQuery, } from './activites.queries' import { NewDownload } from './fichiers' -import { DeepReadonly, SimplePromiseFn, isNonEmptyArray, isNullOrUndefined, memoize } from 'camino-common/src/typescript-tools' +import { SimplePromiseFn, isNonEmptyArray, isNullOrUndefined, memoize } from 'camino-common/src/typescript-tools' import { canEditActivite, isActiviteDeposable } from 'camino-common/src/permissions/activites' import { SectionWithValue } from 'camino-common/src/sections' import { Section, getSectionsWithValue } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' @@ -31,7 +31,7 @@ import { EntrepriseId } from 'camino-common/src/entreprise' import { getCurrent } from 'camino-common/src/date' import { createLargeObject } from '../../database/largeobjects' -const extractContenuFromSectionWithValue = (sections: DeepReadonly<Section[]>, sectionsWithValue: SectionWithValue[]): Contenu => { +const extractContenuFromSectionWithValue = (sections: Section[], sectionsWithValue: SectionWithValue[]): Contenu => { const contenu: Contenu = {} sections.forEach(section => { const currentContent: Record<string, unknown> = {} diff --git a/packages/api/src/api/rest/demarches.queries.ts b/packages/api/src/api/rest/demarches.queries.ts index c1ef07277f7e22d9f1c5391ce891254b9bc70db3..8efabb6ebf5c1abb9bca956e17b3a8e07e412cd3 100644 --- a/packages/api/src/api/rest/demarches.queries.ts +++ b/packages/api/src/api/rest/demarches.queries.ts @@ -38,7 +38,7 @@ import { KM2, km2Validator, m2toKm2, m2Validator } from 'camino-common/src/numbe import { Effect, pipe } from 'effect' import { CaminoError } from 'camino-common/src/zod-tools' import { isAdministration, isSuper, User } from 'camino-common/src/roles' -import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools' const getEtapesByDemarcheIdDbValidator = z.object({ id: etapeIdValidator, @@ -169,11 +169,7 @@ const getDemarchesEnConcurrenceDbValidator = z.object({ demarche_id: demarcheIdValidator, demarche_public_lecture: z.boolean(), }) -export const getDemarchesEnConcurrenceQuery = ( - pool: Pool, - demarcheIdPivot: DemarcheId, - user: DeepReadonly<User> -): Effect.Effect<GetDemarcheMiseEnConcurrence[], CaminoError<EffectDbQueryAndValidateErrors>> => { +export const getDemarchesEnConcurrenceQuery = (pool: Pool, demarcheIdPivot: DemarcheId, user: User): Effect.Effect<GetDemarcheMiseEnConcurrence[], CaminoError<EffectDbQueryAndValidateErrors>> => { return pipe( effectDbQueryAndValidate(getDemarchesEnConcurrenceDb, { demarcheIdPivot }, pool, getDemarchesEnConcurrenceDbValidator), Effect.map(demarches => @@ -228,7 +224,7 @@ const getDemarchePivotEnConcurrenceDbValidator = commonTitreEnConcurrenceValidat export const getDemarchePivotEnConcurrence = ( pool: Pool, demarcheIdPivot: DemarcheId, - _user: DeepReadonly<User> + _user: User ): Effect.Effect<GetResultatMiseEnConcurrence, CaminoError<EffectDbQueryAndValidateErrors | "La démarche n'existe pas">> => { return Effect.Do.pipe( Effect.bind('pivots', () => @@ -327,7 +323,7 @@ const getDemarchesSatellitesEnConcurrenceDbValidator = commonTitreEnConcurrenceV surfaceEnCommun: m2Validator, }) const getDemarchesSatellitesEnConcurrenceDb = sql< - Redefine<IGetDemarchesSatellitesEnConcurrenceDbQuery, { demarcheIdPivot: DemarcheId; perimetrePivot: DeepReadonly<MultiPolygon> }, z.infer<typeof getDemarchesSatellitesEnConcurrenceDbValidator>> + Redefine<IGetDemarchesSatellitesEnConcurrenceDbQuery, { demarcheIdPivot: DemarcheId; perimetrePivot: MultiPolygon }, z.infer<typeof getDemarchesSatellitesEnConcurrenceDbValidator>> >` select tmp."titreNom", @@ -364,7 +360,7 @@ const getPerimetreSansSatelliteValidator = z.object({ surface_sans_satellite: m2Validator, }) const getPerimetreSansSatelliteDb = sql< - Redefine<IGetPerimetreSansSatelliteDbQuery, { perimetrePivot: DeepReadonly<MultiPolygon>; perimetreSatellite: DeepReadonly<MultiPolygon> }, z.infer<typeof getPerimetreSansSatelliteValidator>> + Redefine<IGetPerimetreSansSatelliteDbQuery, { perimetrePivot: MultiPolygon; perimetreSatellite: MultiPolygon }, z.infer<typeof getPerimetreSansSatelliteValidator>> >` SELECT ST_AREA(perimetre_geom_sans_satellite, TRUE) AS surface_sans_satellite, diff --git a/packages/api/src/api/rest/entreprises.queries.ts b/packages/api/src/api/rest/entreprises.queries.ts index afb0098e72059ed50b50b7e1d5758ac5b285b3d3..87c4c4dafe7a59d464fae5808c38a9cfd952d65e 100644 --- a/packages/api/src/api/rest/entreprises.queries.ts +++ b/packages/api/src/api/rest/entreprises.queries.ts @@ -21,7 +21,7 @@ import { } from 'camino-common/src/entreprise' import { EntrepriseDocumentTypeId } from 'camino-common/src/static/documentsTypes' import { CaminoDate } from 'camino-common/src/date' -import { DeepReadonly, NonEmptyArray, isNonEmptyArray, isNonEmptyArrayAndDeepReadonly, onlyUnique } from 'camino-common/src/typescript-tools' +import { NonEmptyArray, isNonEmptyArray, onlyUnique } from 'camino-common/src/typescript-tools' import { Pool } from 'pg' import { canSeeEntrepriseDocuments } from 'camino-common/src/permissions/entreprises' import { roleValidator, User } from 'camino-common/src/roles' @@ -31,16 +31,16 @@ import { CaminoError } from 'camino-common/src/zod-tools' const dummy = ['dummy'] as const export const getEntrepriseDocuments = ( - entrepriseDocumentIds: DeepReadonly<EntrepriseDocumentId[]>, + entrepriseDocumentIds: EntrepriseDocumentId[], entrepriseIds: EntrepriseId[], pool: Pool, - user: DeepReadonly<User> + user: User ): Effect.Effect<EntrepriseDocument[], CaminoError<EffectDbQueryAndValidateErrors>> => { return pipe( effectDbQueryAndValidate( getEntrepriseDocumentsInternal, { - entrepriseDocumentIds: isNonEmptyArrayAndDeepReadonly(entrepriseDocumentIds) ? entrepriseDocumentIds : dummy, + entrepriseDocumentIds: isNonEmptyArray(entrepriseDocumentIds) ? entrepriseDocumentIds : dummy, entrepriseIds: isNonEmptyArray(entrepriseIds) ? entrepriseIds : dummy, }, pool, @@ -53,7 +53,7 @@ export const getEntrepriseDocuments = ( const getEntrepriseDocumentsInternal = sql< Redefine< IGetEntrepriseDocumentsInternalQuery, - { entrepriseDocumentIds: DeepReadonly<NonEmptyArray<EntrepriseDocumentId>> | typeof dummy; entrepriseIds: DeepReadonly<NonEmptyArray<EntrepriseId>> | typeof dummy }, + { entrepriseDocumentIds: NonEmptyArray<EntrepriseDocumentId> | typeof dummy; entrepriseIds: NonEmptyArray<EntrepriseId> | typeof dummy }, EntrepriseDocument > >` @@ -242,7 +242,7 @@ where const checkEntreprisesExistValidator = z.object({ id: entrepriseIdValidator }) const entreprisesNonExistantes = "certaines entreprises n'existent pas" as const export type CheckEntreprisesExistErrors = EffectDbQueryAndValidateErrors | typeof entreprisesNonExistantes -export const checkEntreprisesExist = (pool: Pool, entrepriseIds: DeepReadonly<EntrepriseId[]>): Effect.Effect<DeepReadonly<EntrepriseId[]>, CaminoError<CheckEntreprisesExistErrors>> => { +export const checkEntreprisesExist = (pool: Pool, entrepriseIds: EntrepriseId[]): Effect.Effect<EntrepriseId[], CaminoError<CheckEntreprisesExistErrors>> => { if (entrepriseIds.length === 0) { return Effect.succeed(entrepriseIds) } @@ -257,7 +257,7 @@ export const checkEntreprisesExist = (pool: Pool, entrepriseIds: DeepReadonly<En ) } -const checkEntreprisesExistQuery = sql<Redefine<ICheckEntreprisesExistQueryQuery, { entrepriseIds: DeepReadonly<EntrepriseId[]> }, z.infer<typeof checkEntreprisesExistValidator>>>` +const checkEntreprisesExistQuery = sql<Redefine<ICheckEntreprisesExistQueryQuery, { entrepriseIds: EntrepriseId[] }, z.infer<typeof checkEntreprisesExistValidator>>>` SELECT id FROM diff --git a/packages/api/src/api/rest/etapes.ts b/packages/api/src/api/rest/etapes.ts index 64ed2aedbd7f8de746f399e89fce568763da82b8..42671ad841990fe935bdcd7fb547860b62d89ce6 100644 --- a/packages/api/src/api/rest/etapes.ts +++ b/packages/api/src/api/rest/etapes.ts @@ -24,17 +24,7 @@ import { User, isBureauDEtudes, isEntreprise } from 'camino-common/src/roles' import { canCreateEtape, canDeposeEtape, canDeleteEtape, canEditEtape } from 'camino-common/src/permissions/titres-etapes' import { canBeBrouillon, ETAPES_TYPES, isEtapeTypeId } from 'camino-common/src/static/etapesTypes' -import { - DeepReadonly, - NotNullableKeys, - getKeys, - isNonEmptyArray, - isNotNullNorUndefined, - isNotNullNorUndefinedNorEmpty, - isNullOrUndefined, - memoize, - onlyUnique, -} from 'camino-common/src/typescript-tools' +import { NotNullableKeys, getKeys, isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, memoize, onlyUnique } from 'camino-common/src/typescript-tools' import { Pool } from 'pg' import { EntrepriseDocument, EntrepriseDocumentId, EtapeEntrepriseDocument } from 'camino-common/src/entreprise' import { @@ -229,7 +219,7 @@ export const deleteEtape = } export const getEtape = (_pool: Pool) => - async (req: CaminoRequest, res: CustomResponse<DeepReadonly<FlattenEtape>>): Promise<void> => { + async (req: CaminoRequest, res: CustomResponse<FlattenEtape>): Promise<void> => { const user = req.auth const etapeId = etapeIdOrSlugValidator.safeParse(req.params.etapeIdOrSlug) @@ -269,8 +259,8 @@ type ValidateAndGetEntrepriseDocumentsErrors = typeof documentDEntrepriseIncorre const validateAndGetEntrepriseDocuments = ( pool: Pool, etape: Pick<FlattenEtape, 'titulaires' | 'amodiataires'>, - entrepriseDocumentIds: DeepReadonly<EntrepriseDocumentId[]>, - user: DeepReadonly<User> + entrepriseDocumentIds: EntrepriseDocumentId[], + user: User ): Effect.Effect<EntrepriseDocument[], CaminoError<ValidateAndGetEntrepriseDocumentsErrors>> => Effect.Do.pipe( Effect.filterOrFail( @@ -292,7 +282,7 @@ const validateAndGetEntrepriseDocuments = ( Effect.catchTag("pas de documents d'entreprise", _myError => Effect.succeed([])) ) -export const arePointsOnPerimeter = (perimetre: DeepReadonly<FeatureMultiPolygon>, points: DeepReadonly<FeatureCollectionPoints>): boolean => { +export const arePointsOnPerimeter = (perimetre: FeatureMultiPolygon, points: FeatureCollectionPoints): boolean => { const coordinatesSet = new Set() perimetre.geometry.coordinates.forEach(geometry => geometry.forEach(sub => sub.forEach(coordinate => coordinatesSet.add(`${coordinate[0]}-${coordinate[1]}`)))) @@ -321,7 +311,7 @@ const lespointsdoiventetresurleperimetreerror = 'les points doivent être sur le type PerimetreInfosError = typeof lespointsdoiventetresurleperimetreerror | ConvertPointsErrors | GetGeojsonInformationErrorMessages type PerimetreInfos = { secteursMaritime: SecteursMaritimes[] - sdomZones: DeepReadonly<SDOMZoneId[]> + sdomZones: SDOMZoneId[] surface: KM2 | null } & Pick<GraphqlEtape, 'geojson4326Forages' | 'geojsonOrigineForages'> & Pick<GetGeojsonInformation, 'communes' | 'forets'> @@ -1040,7 +1030,7 @@ const demarcheEtapesTypesGet = ( titreDemarcheId: DemarcheId, date: CaminoDate, titreEtapeId: EtapeId | null, - user: DeepReadonly<User> + user: User ): Effect.Effect<EtapeTypeEtapeStatutWithMainStep, CaminoError<DemarcheEtapesTypesGetErrors>> => { return Effect.Do.pipe( Effect.bind('titreDemarche', () => diff --git a/packages/api/src/api/rest/format/titres-activites.ts b/packages/api/src/api/rest/format/titres-activites.ts index ba1a41da760f093677c8b0b9219f536c7d573aca..1c2b7df16b9a78d172b8046991b4a2b94504cf6c 100644 --- a/packages/api/src/api/rest/format/titres-activites.ts +++ b/packages/api/src/api/rest/format/titres-activites.ts @@ -4,14 +4,14 @@ import { UniteId, Unites } from 'camino-common/src/static/unites' import { getPeriode } from 'camino-common/src/static/frequence' import { ActivitesStatuts } from 'camino-common/src/static/activitesStatuts' import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' -import { DeepReadonly, isNullOrUndefined } from 'camino-common/src/typescript-tools' +import { isNullOrUndefined } from 'camino-common/src/typescript-tools' import { Pool } from 'pg' import { getCommunesIndex } from '../../../database/queries/communes' import { ActivitesTypes } from 'camino-common/src/static/activitesTypes' import { getEntreprises } from '../entreprises.queries' import { EntrepriseId } from 'camino-common/src/entreprise' -const titreActiviteContenuFormat = (contenu: IContenu, sections: DeepReadonly<Section[]>) => +const titreActiviteContenuFormat = (contenu: IContenu, sections: Section[]) => sections.reduce((resSections: Index<IContenuValeur>, section) => { const r = section.elements!.reduce((resElements: Index<IContenuValeur>, element) => { let key = `${section.id}_${element.id}` diff --git a/packages/api/src/api/rest/perimetre.queries.ts b/packages/api/src/api/rest/perimetre.queries.ts index 1df08fe239ecce5dfc11b4ec923a593708e1a2a1..95eb543c5a0c7b660daab660ae885ac2dc79d524 100644 --- a/packages/api/src/api/rest/perimetre.queries.ts +++ b/packages/api/src/api/rest/perimetre.queries.ts @@ -13,7 +13,7 @@ import { secteurDbIdValidator } from 'camino-common/src/static/facades' import { foretIdValidator } from 'camino-common/src/static/forets' import { sdomZoneIdValidator } from 'camino-common/src/static/sdom' import { KM2, M2, createM2Validator, km2Validator, m2Validator } from 'camino-common/src/number' -import { DeepReadonly, isNullOrUndefined } from 'camino-common/src/typescript-tools' +import { isNullOrUndefined } from 'camino-common/src/typescript-tools' import { ZodUnparseable, zodParseEffect, zodParseEffectCallback } from '../../tools/fp-tools' import { CaminoError } from 'camino-common/src/zod-tools' import { Effect, pipe } from 'effect' @@ -35,7 +35,7 @@ const to4326GeoSystemeId: GeoSystemeId = GEO_SYSTEME_IDS.WGS84 export const convertPoints = <T extends z.ZodTypeAny>( pool: Pool, fromGeoSystemeId: GeoSystemeId, - geojsonPoints: DeepReadonly<GenericFeatureCollection<T>> + geojsonPoints: GenericFeatureCollection<T> ): Effect.Effect<GenericFeatureCollection<T>, CaminoError<ConvertPointsErrors>> => { return pipe( Effect.try({ @@ -173,7 +173,7 @@ export const getTitresIntersectionWithGeojson = ( getTitresIntersectionWithGeojsonValidator ) } -type GetTitresIntersectionWithGeojsonDb = DeepReadonly<{ titre_slug: TitreSlug; titre_statut_ids: TitreStatutId[]; geojson4326_perimetre: MultiPolygon; domaine_id: DomaineId }> +type GetTitresIntersectionWithGeojsonDb = { titre_slug: TitreSlug; titre_statut_ids: TitreStatutId[]; geojson4326_perimetre: MultiPolygon; domaine_id: DomaineId } const getTitresIntersectionWithGeojsonDb = sql<Redefine<IGetTitresIntersectionWithGeojsonDbQuery, GetTitresIntersectionWithGeojsonDb, GetTitresIntersectionWithGeojson>>` select t.nom, @@ -196,7 +196,7 @@ const m2ToKm2 = (value: M2): Effect.Effect<KM2, CaminoError<ZodUnparseable>> => const requestError = 'Une erreur inattendue est survenue lors de la récupération des informations geojson en base' as const export type GetGeojsonInformationErrorMessages = ZodUnparseable | DbQueryAccessError | typeof requestError -export const getGeojsonInformation = (pool: Pool, geojson4326_perimetre: DeepReadonly<MultiPolygon>): Effect.Effect<GetGeojsonInformation, CaminoError<GetGeojsonInformationErrorMessages>> => { +export const getGeojsonInformation = (pool: Pool, geojson4326_perimetre: MultiPolygon): Effect.Effect<GetGeojsonInformation, CaminoError<GetGeojsonInformationErrorMessages>> => { return pipe( effectDbQueryAndValidate(getGeojsonInformationDb, { geojson4326_perimetre }, pool, getGeojsonInformationDbValidator), Effect.bind('response', result => (result.length === 1 ? Effect.succeed(result[0]) : Effect.fail({ message: requestError }))), @@ -227,7 +227,7 @@ const getGeojsonInformationValidator = z.object({ // Surface maximale acceptée pour un titre const SURFACE_M2_MAX = 100_000 * 1_000_000 -export type GetGeojsonInformation = DeepReadonly<z.infer<typeof getGeojsonInformationValidator>> +export type GetGeojsonInformation = z.infer<typeof getGeojsonInformationValidator> const getGeojsonInformationCommuneDbValidator = z.object({ id: communeIdValidator, nom: z.string(), surface: m2Validator }) const getGeojsonInformationDbValidator = z.object({ @@ -238,7 +238,7 @@ const getGeojsonInformationDbValidator = z.object({ secteurs: z.array(secteurDbIdValidator).nullable().transform(nullToEmptyArray), }) type GetGeojsonInformationDbValidator = z.infer<typeof getGeojsonInformationDbValidator> -const getGeojsonInformationDb = sql<Redefine<IGetGeojsonInformationDbQuery, DeepReadonly<{ geojson4326_perimetre: MultiPolygon }>, GetGeojsonInformationDbValidator>>` +const getGeojsonInformationDb = sql<Redefine<IGetGeojsonInformationDbQuery, { geojson4326_perimetre: MultiPolygon }, GetGeojsonInformationDbValidator>>` select ( select diff --git a/packages/api/src/api/rest/perimetre.ts b/packages/api/src/api/rest/perimetre.ts index d4993f37e4004664c44ff0cec3637f29fa87326f..076007d0d3b00b861921c036d287552336a35d96 100644 --- a/packages/api/src/api/rest/perimetre.ts +++ b/packages/api/src/api/rest/perimetre.ts @@ -41,7 +41,7 @@ import { import { join } from 'node:path' import { readFileSync } from 'node:fs' import { parseShp } from 'shpjs' -import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined, memoize } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNullOrUndefined, memoize } from 'camino-common/src/typescript-tools' import { SDOMZoneId } from 'camino-common/src/static/sdom' import { TitreSlug } from 'camino-common/src/validators/titres' import { canReadEtape } from './permissions/etapes' @@ -194,7 +194,7 @@ type GeojsonImportErrorMessages = | GetGeojsonByGeoSystemeIdErrorMessages | GetGeojsonInformationErrorMessages | ConvertPointsErrors -export const geojsonImport: RestNewPostCall<'/rest/geojson/import/:geoSystemeId'> = (rootPipe): Effect.Effect<DeepReadonly<GeojsonInformations>, CaminoApiError<GeojsonImportErrorMessages>> => { +export const geojsonImport: RestNewPostCall<'/rest/geojson/import/:geoSystemeId'> = (rootPipe): Effect.Effect<GeojsonInformations, CaminoApiError<GeojsonImportErrorMessages>> => { return rootPipe.pipe( Effect.let('pathFrom', ({ body }) => join(process.cwd(), `/files/tmp/${body.tempDocumentName}`)), Effect.bind('result', ({ body, pathFrom, params }) => { @@ -565,7 +565,7 @@ const getAlertesSuperposition = ( geojson4326_perimetre: MultiPolygon | null, titreTypeId: TitreTypeId, titreSlug: TitreSlug, - user: DeepReadonly<User>, + user: User, pool: Pool ): Effect.Effect<GetTitresIntersectionWithGeojson[], CaminoError<ZodUnparseable | DbQueryAccessError>> => { if (titreTypeId === 'axm' && (isSuper(user) || isAdministrationAdmin(user) || isAdministrationEditeur(user)) && geojson4326_perimetre !== null) { diff --git a/packages/api/src/api/rest/titre-demande.queries.ts b/packages/api/src/api/rest/titre-demande.queries.ts index 6e7cf21471b1d2baa898c67112059546ea34c70d..4e9a80f714973cecb846ead12e29d6c082644925 100644 --- a/packages/api/src/api/rest/titre-demande.queries.ts +++ b/packages/api/src/api/rest/titre-demande.queries.ts @@ -11,7 +11,6 @@ import { newDemarcheId, newDemarcheSlug, newTitreId, newTitreSlug } from '../../ import { CaminoError } from 'camino-common/src/zod-tools.js' import { ICreateTitreDemarcheInternalQuery, ICreateTitreInternalQuery } from './titre-demande.queries.types.js' import { TitreDemande } from 'camino-common/src/titres.js' -import { DeepReadonly } from 'camino-common/src/typescript-tools.js' import { DemarcheId, DemarcheSlug } from 'camino-common/src/demarche.js' import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes.js' @@ -19,7 +18,7 @@ type CreateTitreInput = Omit<TitreDemande, 'titreFromIds' | 'entrepriseId'> const creationTitreImpossible = 'Création du titre impossible' as const export type CreateTitreErrors = DbQueryAccessError | ZodUnparseable | 'Accès interdit' | typeof creationTitreImpossible -export const createTitre = (pool: Pool, user: DeepReadonly<User>, titreInput: DeepReadonly<CreateTitreInput>): Effect.Effect<TitreId, CaminoError<CreateTitreErrors>> => +export const createTitre = (pool: Pool, user: User, titreInput: CreateTitreInput): Effect.Effect<TitreId, CaminoError<CreateTitreErrors>> => Effect.Do.pipe( Effect.filterOrFail( () => canCreateTitre(user, titreInput.titreTypeId), @@ -36,7 +35,7 @@ export const createTitre = (pool: Pool, user: DeepReadonly<User>, titreInput: De Effect.map(({ id }) => id) ) -const createTitreInternal = sql<Redefine<ICreateTitreInternalQuery, DeepReadonly<{ id: TitreId; slug: TitreSlug; references: string } & Omit<CreateTitreInput, 'references'>>, void>>` +const createTitreInternal = sql<Redefine<ICreateTitreInternalQuery, { id: TitreId; slug: TitreSlug; references: string } & Omit<CreateTitreInput, 'references'>, void>>` INSERT INTO titres (id, slug, nom, type_id, "references") VALUES ($ id !, $slug!, $ nom !, $ titreTypeId!, $references!) ` @@ -56,7 +55,7 @@ export const createDemarche = (pool: Pool, titreId: TitreId, demarcheTypeId: Dem Effect.map(({ id }) => id) ) } -const createTitreDemarcheInternal = sql<Redefine<ICreateTitreDemarcheInternalQuery, DeepReadonly<{ id: DemarcheId; slug: DemarcheSlug; titre_id: TitreId; demarcheTypeId: DemarcheTypeId }>, void>>` +const createTitreDemarcheInternal = sql<Redefine<ICreateTitreDemarcheInternalQuery, { id: DemarcheId; slug: DemarcheSlug; titre_id: TitreId; demarcheTypeId: DemarcheTypeId }, void>>` INSERT INTO titres_demarches (id, slug, titre_id, type_id) VALUES ($ id !, $slug!, $ titre_id !, $demarcheTypeId) ` diff --git a/packages/api/src/api/rest/titre-demande.ts b/packages/api/src/api/rest/titre-demande.ts index c8e068376d925d53464c34e45d23cc98a21b9240..3fa523b631768a91e7fdbce267618b9064fc4653 100644 --- a/packages/api/src/api/rest/titre-demande.ts +++ b/packages/api/src/api/rest/titre-demande.ts @@ -5,7 +5,7 @@ import { isEntrepriseOrBureauDEtude } from 'camino-common/src/roles' import { linkTitres } from '../../database/queries/titres-titres.queries' import { canCreateTitre } from 'camino-common/src/permissions/titres' import { checkTitreLinks } from '../../business/validations/titre-links-validate' -import { DeepReadonly, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefinedNorEmpty, isNullOrUndefined, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools' import { createAutomaticallyEtapeWhenCreatingTitre, TitreDemandeOutput } from 'camino-common/src/titres' import { HTTP_STATUS } from 'camino-common/src/http' import { ETAPE_IS_BROUILLON } from 'camino-common/src/etape' @@ -113,7 +113,7 @@ export const titreDemandeCreer: RestNewPostCall<'/rest/titres'> = (rootPipe): Ef if (isNullOrUndefinedOrEmpty(titreDemande.entrepriseId)) { throw new Error('Ne devrait jamais se produire, réduction pour typescript qui ne voit pas le filterOrFail au dessus') } - const titreEtape: DeepReadonly<Omit<ITitreEtape, 'id' | 'concurrence' | 'hasTitreFrom'>> = { + const titreEtape: Omit<ITitreEtape, 'id' | 'concurrence' | 'hasTitreFrom'> = { titreDemarcheId: demarcheId, typeId: 'mfr', statutId: 'fai', diff --git a/packages/api/src/api/rest/titres.ts b/packages/api/src/api/rest/titres.ts index f8e69ee5d6829d6a05609cce05e7c279f2e7b85e..0d6a8ae66b64bd131ef0775091a489535554d9dc 100644 --- a/packages/api/src/api/rest/titres.ts +++ b/packages/api/src/api/rest/titres.ts @@ -5,7 +5,7 @@ import { CaminoRequest, CustomResponse } from './express-type' import { userSuper } from '../../database/user-super' import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, onlyUnique } from 'camino-common/src/typescript-tools' import { CaminoApiError } from '../../types' -import { DeepReadonly, NotNullableKeys, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools' +import { NotNullableKeys, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools' import TitresTitres from '../../database/models/titres--titres' import { titreAdministrationsGet } from '../_format/titres' import { canDeleteTitre, canEditTitre, canLinkTitres } from 'camino-common/src/permissions/titres' @@ -266,7 +266,7 @@ export const postTitreLiaisons: RestNewPostCall<'/rest/titres/:id/titreLiaisons' ) } -const titreLinksGet = (titreId: string, link: 'titreToId' | 'titreFromId', user: DeepReadonly<User>): Effect.Effect<TitreLink[], CaminoError<DbQueryAccessError>> => { +const titreLinksGet = (titreId: string, link: 'titreToId' | 'titreFromId', user: User): Effect.Effect<TitreLink[], CaminoError<DbQueryAccessError>> => { return pipe( Effect.tryPromise({ try: async () => TitresTitres.query().where(link === 'titreToId' ? 'titreFromId' : 'titreToId', titreId), diff --git a/packages/api/src/api/rest/utilisateurs.queries.ts b/packages/api/src/api/rest/utilisateurs.queries.ts index 03c168db2a488b5ece8dbb5b97f2326c7c601f07..392508500128d279ef0474cab8317664abe8b7b6 100644 --- a/packages/api/src/api/rest/utilisateurs.queries.ts +++ b/packages/api/src/api/rest/utilisateurs.queries.ts @@ -1,5 +1,4 @@ import { sql } from '@pgtyped/runtime' -import { DeepReadonly } from 'camino-common/src/typescript-tools' import { QGISToken } from 'camino-common/src/utilisateur' import { CaminoError } from 'camino-common/src/zod-tools' import { Effect, pipe } from 'effect' @@ -10,12 +9,10 @@ import { UserNotNull, UtilisateurId } from 'camino-common/src/roles' import bcrypt from 'bcryptjs' import { IUpdateQgisTokenInternalQuery } from './utilisateurs.queries.types' -export const updateQgisToken = (pool: Pool, user: DeepReadonly<UserNotNull>, qgisToken: QGISToken): Effect.Effect<boolean, CaminoError<EffectDbQueryAndValidateErrors>> => +export const updateQgisToken = (pool: Pool, user: UserNotNull, qgisToken: QGISToken): Effect.Effect<boolean, CaminoError<EffectDbQueryAndValidateErrors>> => pipe( effectDbQueryAndValidate(updateQgisTokenInternal, { user_id: user.id, qgisToken: bcrypt.hashSync(qgisToken, 10) }, pool, z.void()), Effect.map(() => true) ) -const updateQgisTokenInternal = sql< - Redefine<IUpdateQgisTokenInternalQuery, DeepReadonly<{ user_id: UtilisateurId; qgisToken: string }>, void> ->`UPDATE utilisateurs set qgis_token=$qgisToken! where id=$user_id!` +const updateQgisTokenInternal = sql<Redefine<IUpdateQgisTokenInternalQuery, { user_id: UtilisateurId; qgisToken: string }, void>>`UPDATE utilisateurs set qgis_token=$qgisToken! where id=$user_id!` diff --git a/packages/api/src/api/rest/utilisateurs.ts b/packages/api/src/api/rest/utilisateurs.ts index b131ecb1062cd59275022dad2506be727c3ba2d6..77ff405d2a1915f6018c1cf3dea16836dd8c1418 100644 --- a/packages/api/src/api/rest/utilisateurs.ts +++ b/packages/api/src/api/rest/utilisateurs.ts @@ -11,7 +11,7 @@ import { idGenerate } from '../../database/models/_format/id-create' import { utilisateurUpdationValidate } from '../../business/validations/utilisateur-updation-validate' import { canDeleteUtilisateur } from 'camino-common/src/permissions/utilisateurs' import { Pool } from 'pg' -import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools' import { config } from '../../config/index' import { Effect, Match } from 'effect' import { RestNewGetCall, RestNewPostCall } from '../../server/rest' @@ -292,7 +292,7 @@ export const utilisateurs = type GetUtilisateursError = DbQueryAccessError | ZodUnparseable | "Impossible d'accéder à la liste des utilisateurs" | 'droits insuffisants' -export const getUtilisateurs: RestNewGetCall<'/rest/utilisateurs'> = (rootPipe): Effect.Effect<DeepReadonly<UtilisateursTable>, CaminoApiError<GetUtilisateursError>> => { +export const getUtilisateurs: RestNewGetCall<'/rest/utilisateurs'> = (rootPipe): Effect.Effect<UtilisateursTable, CaminoApiError<GetUtilisateursError>> => { return rootPipe.pipe( Effect.bind('utilisateurs', ({ pool, user, searchParams }) => getUtilisateursFilteredAndSorted(pool, user, searchParams)), Effect.map(({ utilisateurs, searchParams }) => { @@ -313,7 +313,7 @@ export const getUtilisateurs: RestNewGetCall<'/rest/utilisateurs'> = (rootPipe): } type GetUtilisateurError = DbQueryAccessError | ZodUnparseable | 'droits insuffisants' -export const getUtilisateur: RestNewGetCall<'/rest/utilisateurs/:id'> = (rootPipe): Effect.Effect<DeepReadonly<UserNotNull>, CaminoApiError<GetUtilisateurError>> => { +export const getUtilisateur: RestNewGetCall<'/rest/utilisateurs/:id'> = (rootPipe): Effect.Effect<UserNotNull, CaminoApiError<GetUtilisateurError>> => { return rootPipe.pipe( Effect.flatMap(({ pool, params, user }) => newGetUtilisateurById(pool, params.id, user)), Effect.mapError(caminoError => diff --git a/packages/api/src/business/matrices.ts b/packages/api/src/business/matrices.ts index f0439af663cf518897f7b5fbf89f23786449fe15..66343e629c116beba88ea37f9336e91bab1e5a9d 100644 --- a/packages/api/src/business/matrices.ts +++ b/packages/api/src/business/matrices.ts @@ -2,7 +2,7 @@ import '../init' import { FiscaliteFrance, decimalValidator, fiscaliteValidator, type Fiscalite } from 'camino-common/src/validators/fiscalite' import { ICommune, IContenuValeur } from '../types' import { departementIdValidator, Departements, toDepartementId } from 'camino-common/src/static/departement' -import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools' import { Commune, CommuneId, communeIdValidator, communeValidator } from 'camino-common/src/static/communes' import { CaminoAnnee } from 'camino-common/src/date' @@ -161,7 +161,7 @@ export const getRawLines = ( const production = conversion(substancesFiscale, activite.contenu.substancesFiscales?.[substancesFiscale.id] ?? null) if (production.value.greaterThan(0)) { - const communes: DeepReadonly<ICommune[]> = titre.communes + const communes: ICommune[] = titre.communes if (isNullOrUndefined(titresToBuild[titre.id])) { const surfaceTotale = titre.communes.reduce((value, commune) => value.add(commune.surface ?? 0), new Decimal(0)) diff --git a/packages/api/src/business/processes/titres-etapes-areas-update.ts b/packages/api/src/business/processes/titres-etapes-areas-update.ts index 6362966dd63eeda9b0cb627644309e79f13c4128..6a93e0f3b77a3de21e47d8bc1efb0c7ca94f334e 100644 --- a/packages/api/src/business/processes/titres-etapes-areas-update.ts +++ b/packages/api/src/business/processes/titres-etapes-areas-update.ts @@ -6,7 +6,7 @@ import { SecteursMaritimes, SecteursMaritimesIds, getSecteurMaritime } from 'cam import { knex } from '../../knex' import { ForetId } from 'camino-common/src/static/forets' import { CommuneId, toCommuneId } from 'camino-common/src/static/communes' -import { DeepReadonly, isNotNullNorUndefined, onlyUnique } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, onlyUnique } from 'camino-common/src/typescript-tools' import { getGeojsonInformation } from '../../api/rest/perimetre.queries' import type { Pool } from 'pg' import { SDOMZoneId } from 'camino-common/src/static/sdom' @@ -53,7 +53,7 @@ export const titresEtapesAreasUpdate = async (pool: Pool, titresEtapesIds?: stri } } } -async function intersectSdom(titreEtape: Pick<ITitreEtape, 'sdomZones' | 'id'>, sdomZonesIds: DeepReadonly<SDOMZoneId[]>) { +async function intersectSdom(titreEtape: Pick<ITitreEtape, 'sdomZones' | 'id'>, sdomZonesIds: SDOMZoneId[]) { if (sdomZonesIds.length > 0) { const sortedSdomZonesIds = sdomZonesIds.toSorted() @@ -64,7 +64,7 @@ async function intersectSdom(titreEtape: Pick<ITitreEtape, 'sdomZones' | 'id'>, } } -async function intersectForets(titreEtape: Pick<ITitreEtape, 'forets' | 'id'>, foretsNew: DeepReadonly<ForetId[]>) { +async function intersectForets(titreEtape: Pick<ITitreEtape, 'forets' | 'id'>, foretsNew: ForetId[]) { if (!titreEtape.forets) { throw new Error('les forêts de l’étape ne sont pas chargées') } @@ -79,7 +79,7 @@ async function intersectForets(titreEtape: Pick<ITitreEtape, 'forets' | 'id'>, f } } -async function intersectCommunes(titreEtape: Pick<ITitreEtape, 'communes' | 'id' | 'geojson4326Perimetre'>, communes: DeepReadonly<{ id: CommuneId; surface: M2 }[]>) { +async function intersectCommunes(titreEtape: Pick<ITitreEtape, 'communes' | 'id' | 'geojson4326Perimetre'>, communes: { id: CommuneId; surface: M2 }[]) { const communesNew: { id: CommuneId; surface: M2 }[] = communes.map(({ id, surface }) => ({ id: toCommuneId(id), surface })).toSorted((a, b) => a.id.localeCompare(b.id)) if (titreEtape.communes?.length !== communesNew.length || titreEtape.communes.some((value, index) => value.id !== communesNew[index].id || value.surface !== communesNew[index].surface)) { console.info(`Mise à jour des communes sur l'étape ${titreEtape.id}, ancien: '${JSON.stringify(titreEtape.communes)}', nouveaux: '${JSON.stringify(communesNew)}'`) @@ -89,7 +89,7 @@ async function intersectCommunes(titreEtape: Pick<ITitreEtape, 'communes' | 'id' } } -async function intersectSecteursMaritime(titreEtape: Pick<ITitreEtape, 'secteursMaritime' | 'id'>, secteursMaritime: DeepReadonly<SecteursMaritimesIds[]>) { +async function intersectSecteursMaritime(titreEtape: Pick<ITitreEtape, 'secteursMaritime' | 'id'>, secteursMaritime: SecteursMaritimesIds[]) { const secteurMaritimeNew: SecteursMaritimes[] = secteursMaritime .map(id => getSecteurMaritime(id)) .filter(onlyUnique) diff --git a/packages/api/src/business/processes/titres-etapes-consentement.queries.ts b/packages/api/src/business/processes/titres-etapes-consentement.queries.ts index 8790485c1014c015b782a09e427e4fb78017fe8a..ed402d3b37f3d5161a89daac4941420eeacfaf9e 100644 --- a/packages/api/src/business/processes/titres-etapes-consentement.queries.ts +++ b/packages/api/src/business/processes/titres-etapes-consentement.queries.ts @@ -12,7 +12,7 @@ import { sql } from '@pgtyped/runtime' import { shortCircuitError, ZodUnparseable } from '../../tools/fp-tools' import { etapeTypeIdValidator } from 'camino-common/src/static/etapesTypes' import { MultiPolygon, multiPolygonValidator } from 'camino-common/src/perimetre' -import { DeepReadonly, isNotNullNorUndefined } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools' import { SubstanceLegaleId, substanceLegaleIdValidator } from 'camino-common/src/static/substancesLegales' type GetEtapeConsentement = Omit<GetEtapeConsentementDb, 'geojson4326_perimetre'> & { geojson4326_perimetre: MultiPolygon } @@ -102,7 +102,7 @@ type GetDemarchesEnSuperpositionPourConsentement = z.infer<typeof getDemarchesEn const getDemarchesEnSuperpositionPourConsentementDb = sql< Redefine< IGetDemarchesEnSuperpositionPourConsentementDbQuery, - { dateDemande: CaminoDate; perimetreDemande: DeepReadonly<MultiPolygon>; substancesDemande: DeepReadonly<SubstanceLegaleId[]> }, + { dateDemande: CaminoDate; perimetreDemande: MultiPolygon; substancesDemande: SubstanceLegaleId[] }, GetDemarchesEnSuperpositionPourConsentement > >` @@ -131,5 +131,5 @@ const demarcheIdArrayStringifyValidator = z type DemarcheIdArrayStringify = z.infer<typeof demarcheIdArrayStringifyValidator> const updateEtapeConsentementDb = sql< - Redefine<IUpdateEtapeConsentementDbQuery, { etapeId: EtapeId; demarcheIds: DeepReadonly<DemarcheIdArrayStringify> }, void> + Redefine<IUpdateEtapeConsentementDbQuery, { etapeId: EtapeId; demarcheIds: DemarcheIdArrayStringify }, void> >`UPDATE titres_etapes SET demarche_ids_consentement = $demarcheIds! WHERE id = $etapeId!` diff --git a/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.ts b/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.ts index 6bddd8caffe6c8352458fd7923a4e1bf0b6a97f5..95ff787c237033b5d7146778769fef8fd8310dce 100644 --- a/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.ts +++ b/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.ts @@ -3,13 +3,13 @@ import { titreEtapeHeritageContenuFind } from '../utils/titre-etape-heritage-con import { titreEtapesSortAscByOrdre, titreEtapesSortDescByOrdre } from '../utils/titre-etapes-sort' import { UserNotNull } from 'camino-common/src/roles' import { getSections, Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' -import { DeepReadonly, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' import { DemarcheId } from 'camino-common/src/demarche' import { Pool } from 'pg' import { getDemarches } from './titres-etapes-heritage-contenu-update.queries' import { EtapeId } from 'camino-common/src/etape' -export const titresEtapesHeritageContenuUpdate = async (pool: Pool, user: DeepReadonly<UserNotNull>, demarcheId?: DemarcheId): Promise<string[]> => { +export const titresEtapesHeritageContenuUpdate = async (pool: Pool, user: UserNotNull, demarcheId?: DemarcheId): Promise<string[]> => { console.info() console.info('héritage des contenus des étapes…') @@ -24,7 +24,7 @@ export const titresEtapesHeritageContenuUpdate = async (pool: Pool, user: DeepRe for (const titreDemarche of Object.values(titresDemarches)) { if (titreDemarche.etapes.length) { const etapeSectionsDictionary = titreDemarche.etapes.reduce<{ - [etapeId in EtapeId]?: DeepReadonly<Section[]> + [etapeId in EtapeId]?: Section[] }>((acc, e) => { acc[e.id] = getSections(titreDemarche.titreTypeId, titreDemarche.typeId, e.typeId) diff --git a/packages/api/src/business/processes/titres-etapes-heritage-props-update.ts b/packages/api/src/business/processes/titres-etapes-heritage-props-update.ts index e9e326c913261a7d5a34ada0da9aca1f9b93bf51..9e28729d6763fbc0e52583123006723ccb249298 100644 --- a/packages/api/src/business/processes/titres-etapes-heritage-props-update.ts +++ b/packages/api/src/business/processes/titres-etapes-heritage-props-update.ts @@ -7,9 +7,8 @@ import { userSuper } from '../../database/user-super' import { titreEtapesSortAscByOrdre } from '../utils/titre-etapes-sort' import { UserNotNull } from 'camino-common/src/roles' import { EtapesTypes } from 'camino-common/src/static/etapesTypes' -import { DeepReadonly } from 'camino-common/src/typescript-tools' -export const titresEtapesHeritagePropsUpdate = async (user: DeepReadonly<UserNotNull>, titresDemarchesIds?: string[]): Promise<string[]> => { +export const titresEtapesHeritagePropsUpdate = async (user: UserNotNull, titresDemarchesIds?: string[]): Promise<string[]> => { console.info() console.info('héritage des propriétés des étapes…') @@ -39,7 +38,7 @@ export const titresEtapesHeritagePropsUpdate = async (user: DeepReadonly<UserNot const { hasChanged, titreEtape: newTitreEtape } = titreEtapeHeritagePropsFind(titreEtape, titreEtapePrecedente) if (hasChanged) { - await titreEtapeUpsert(newTitreEtape as DeepReadonly<ITitreEtape>, user, titreDemarche.titreId) + await titreEtapeUpsert(newTitreEtape as ITitreEtape, user, titreDemarche.titreId) console.info('titre / démarche / étape : héritage des propriétés (mise à jour) ->', titreEtape.id) diff --git a/packages/api/src/business/processes/titres-etapes-ordre-update.ts b/packages/api/src/business/processes/titres-etapes-ordre-update.ts index d6f7cecac88db786fff17966af1d5a266855028d..bba05deef33cacae5a25f4462b52422fa1064ded 100644 --- a/packages/api/src/business/processes/titres-etapes-ordre-update.ts +++ b/packages/api/src/business/processes/titres-etapes-ordre-update.ts @@ -8,9 +8,9 @@ import { DemarcheId } from 'camino-common/src/demarche' import { Pool } from 'pg' import { TitreId } from 'camino-common/src/validators/titres' import { TitreEtapeForMachine, titreEtapeForMachineValidator } from '../rules-demarches/machine-common' -import { DeepReadonly, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' -export const titresEtapesOrdreUpdate = async (pool: Pool, user: DeepReadonly<UserNotNull>, demarcheId?: DemarcheId): Promise<string[]> => { +export const titresEtapesOrdreUpdate = async (pool: Pool, user: UserNotNull, demarcheId?: DemarcheId): Promise<string[]> => { console.info() console.info('ordre des étapes…') @@ -20,7 +20,7 @@ export const titresEtapesOrdreUpdate = async (pool: Pool, user: DeepReadonly<Use } export const titresEtapesOrdreUpdateVisibleForTesting = async ( - user: DeepReadonly<UserNotNull>, + user: UserNotNull, titresDemarches: { [key: DemarcheId]: { etapes: TitreEtapeForMachine[] diff --git a/packages/api/src/business/rules-demarches/machine-common.ts b/packages/api/src/business/rules-demarches/machine-common.ts index a05db00133b1f3c088ce2d0f66afb055dae2f905..5fc30cc19cc5da25ccc60db548c30ed7d119075b 100644 --- a/packages/api/src/business/rules-demarches/machine-common.ts +++ b/packages/api/src/business/rules-demarches/machine-common.ts @@ -11,7 +11,7 @@ import { PaysId } from 'camino-common/src/static/pays' import { communeIdValidator } from 'camino-common/src/static/communes' import { z } from 'zod' import { ETAPE_IS_NOT_BROUILLON, etapeBrouillonValidator, etapeIdValidator } from 'camino-common/src/etape' -import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' import { KM2, km2Validator } from 'camino-common/src/number' import { concurrenceValidator, Consentement, DemarcheVisibilite } from 'camino-common/src/etape-form' import { demarcheIdValidator } from 'camino-common/src/demarche' @@ -73,7 +73,7 @@ export const titreEtapeForMachineValidator = z.object({ export type TitreEtapeForMachine = z.infer<typeof titreEtapeForMachineValidator> -export const toMachineEtapes = (etapes: DeepReadonly<(Pick<Partial<TitreEtapeForMachine>, 'ordre'> & Omit<TitreEtapeForMachine, 'id' | 'ordre'>)[]>): Etape[] => { +export const toMachineEtapes = (etapes: (Pick<Partial<TitreEtapeForMachine>, 'ordre'> & Omit<TitreEtapeForMachine, 'id' | 'ordre'>)[]): Etape[] => { // TODO 2022-10-12 si on appelle titreEtapesSortAscByOrdre on se retrouve avec une grosse dépendance cyclique return etapes .filter(dbEtape => dbEtape.isBrouillon === ETAPE_IS_NOT_BROUILLON) @@ -81,7 +81,7 @@ export const toMachineEtapes = (etapes: DeepReadonly<(Pick<Partial<TitreEtapeFor .map(dbEtape => toMachineEtape(dbEtape)) } -const toMachineEtape = (dbEtape: DeepReadonly<Omit<TitreEtapeForMachine, 'id' | 'ordre'>>): Etape => { +const toMachineEtape = (dbEtape: Omit<TitreEtapeForMachine, 'id' | 'ordre'>): Etape => { let typeId if (isEtapeTypeId(dbEtape.typeId)) { typeId = dbEtape.typeId diff --git a/packages/api/src/business/rules/titre-activites-build.ts b/packages/api/src/business/rules/titre-activites-build.ts index 5145e6e7a8227be061bbb06e083346fafa4e3045..5759e8cd7399e06d66069f5dae080acf87bb3bad 100644 --- a/packages/api/src/business/rules/titre-activites-build.ts +++ b/packages/api/src/business/rules/titre-activites-build.ts @@ -9,14 +9,14 @@ import { FrequenceId, Frequences, getNumberOfMonths } from 'camino-common/src/st import { SubstanceLegaleId } from 'camino-common/src/static/substancesLegales' import { CaminoDate, toCaminoDate } from 'camino-common/src/date' import { TitreTypeId } from 'camino-common/src/static/titresTypes' -import { DeepReadonly, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools' import { ActiviteSection, ActiviteSectionElement, ActivitesTypes, ActivitesTypesId, isSubstancesFiscales } from 'camino-common/src/static/activitesTypes' import { TitreId } from 'camino-common/src/validators/titres' const substancesFiscalesFind = (substances: (SubstanceLegaleId | undefined)[]): SubstanceFiscale[] => substances.filter(s => !!s).flatMap(substanceId => substancesFiscalesBySubstanceLegale(substanceId)) -const titreActiviteSectionElementsFormat = (elements: DeepReadonly<ActiviteSectionElement[]>, periodeId: number, date: CaminoDate) => +const titreActiviteSectionElementsFormat = (elements: ActiviteSectionElement[], periodeId: number, date: CaminoDate) => elements.filter( e => // ne conserve que les éléments dont @@ -35,16 +35,9 @@ const titreActiviteSectionElementsFormat = (elements: DeepReadonly<ActiviteSecti * @param titreDemarches - démarches du titre * @param titreTypeId - le type id du titre */ -const titreActiviteSectionsBuild = ( - activiteTypeId: string, - sections: DeepReadonly<ActiviteSection[]>, - periodeId: number, - date: CaminoDate, - titreDemarches: ITitreDemarche[], - titreTypeId: TitreTypeId -) => { - return sections.reduce<DeepReadonly<ActiviteSection[]>>((newSections: DeepReadonly<ActiviteSection[]>, s) => { - let elements: DeepReadonly<ActiviteSectionElement[]> = [] +const titreActiviteSectionsBuild = (activiteTypeId: string, sections: ActiviteSection[], periodeId: number, date: CaminoDate, titreDemarches: ITitreDemarche[], titreTypeId: TitreTypeId) => { + return sections.reduce<ActiviteSection[]>((newSections: ActiviteSection[], s) => { + let elements: ActiviteSectionElement[] = [] if (!isSubstancesFiscales(s) && isNotNullNorUndefinedNorEmpty(s.elements)) { elements = titreActiviteSectionElementsFormat(s.elements, periodeId, date) @@ -56,7 +49,7 @@ const titreActiviteSectionsBuild = ( elements = substancesFiscales.map(sf => { const unite = Unites[sf.uniteId] - const element: DeepReadonly<ActiviteSectionElement> = { + const element: ActiviteSectionElement = { id: sf.id, nom: `${sf.nom}`, type: 'number', @@ -104,7 +97,7 @@ const titreActiviteFind = (activiteTypeId: ActivitesTypesId, annee: number, peri const titreActiviteBuild = ( typeId: ActivitesTypesId, periodeId: number, - activiteTypeSections: DeepReadonly<ActiviteSection[]>, + activiteTypeSections: ActiviteSection[], annee: number, frequenceId: FrequenceId, aujourdhui: CaminoDate, diff --git a/packages/api/src/business/rules/titre-demarche-statut-id-find.ts b/packages/api/src/business/rules/titre-demarche-statut-id-find.ts index 33bd816e4e498b6acbd388ccb773d481dd95d94a..98254b8141e399dc9f3574e5c42905a3b60f77a3 100644 --- a/packages/api/src/business/rules/titre-demarche-statut-id-find.ts +++ b/packages/api/src/business/rules/titre-demarche-statut-id-find.ts @@ -9,8 +9,8 @@ import { TITRES_TYPES_IDS, TitreTypeId } from 'camino-common/src/static/titresTy import { DemarcheTypeId, TravauxIds } from 'camino-common/src/static/demarchesTypes' import { ETAPES_TYPES, EtapeTypeId } from 'camino-common/src/static/etapesTypes' import { isEtapeStatusRejete } from 'camino-common/src/static/etapesStatuts' -import { isNotNullNorUndefined, RecordPartial } from 'camino-common/src/typescript-tools' -import { CaminoMachines, machineFind } from '../rules-demarches/machines' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, RecordPartial } from 'camino-common/src/typescript-tools' +import { machineFind } from '../rules-demarches/machines' const titreEtapesDecisivesCommunesTypes: EtapeTypeId[] = ['css', 'abd', 'and'] @@ -281,7 +281,7 @@ const titreDemarcheTravauxStatutIdFind = (titreDemarcheEtapes: Pick<ITitreEtape, export const titreDemarcheStatutIdFind = (demarcheTypeId: DemarcheTypeId, titreDemarcheEtapes: TitreEtapeForMachine[], titreTypeId: TitreTypeId, demarcheId: DemarcheId): DemarcheStatutId => { // si la démarche ne contient pas d'étapes // -> le statut est indétrminé - if (!titreDemarcheEtapes.length) return DemarchesStatutsIds.Indetermine + if (!isNotNullNorUndefinedNorEmpty(titreDemarcheEtapes)) return DemarchesStatutsIds.Indetermine // si la démarche est pour des travaux if (titreDemarchesTravauxTypes.includes(demarcheTypeId)) { @@ -290,10 +290,7 @@ export const titreDemarcheStatutIdFind = (demarcheTypeId: DemarcheTypeId, titreD const firstEtapeDate = demarcheEnregistrementDemandeDateFind(titreDemarcheEtapes) - let machine: CaminoMachines | undefined - if (isNotNullNorUndefined(firstEtapeDate)) { - machine = machineFind(titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate) - } + const machine = machineFind(titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate) if (isNotNullNorUndefined(machine)) { return machine.demarcheStatut(toMachineEtapes(titreDemarcheEtapes)).demarcheStatut diff --git a/packages/api/src/business/titre-etape-update.ts b/packages/api/src/business/titre-etape-update.ts index c14939b7b4a1d8c5c4ed43fc0c2d6879e72bf8f2..8f99a0e14393e4734a9558540e35635ea6417d30 100644 --- a/packages/api/src/business/titre-etape-update.ts +++ b/packages/api/src/business/titre-etape-update.ts @@ -21,13 +21,12 @@ import { titresActivitesPropsUpdate } from './processes/titres-activites-props-u import { userSuper } from '../database/user-super' import type { UserNotNull } from 'camino-common/src/roles' import type { Pool } from 'pg' -import { DeepReadonly } from 'camino-common/src/typescript-tools' import { callAndExit } from '../tools/fp-tools' import { etapeMiseEnConcurrenceUpdate } from './processes/titres-etapes-mise-en-concurrence' import { etapesFondamentaleIdUpdate } from './processes/titres-etapes-fondamentale-id-update' import { etapeConsentementUpdate } from './processes/titres-etapes-consentement' -export const titreEtapeUpdateTask = async (pool: Pool, titreEtapeId: EtapeId | null, titreDemarcheId: DemarcheId, user: DeepReadonly<UserNotNull>): Promise<void> => { +export const titreEtapeUpdateTask = async (pool: Pool, titreEtapeId: EtapeId | null, titreDemarcheId: DemarcheId, user: UserNotNull): Promise<void> => { try { console.info() console.info('- - -') diff --git a/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts b/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts index 523b20b6dc9f4ab696820fa447911cb0dff29c46..f235341af9796801aa4165dd44a005fe4e0a1a89 100644 --- a/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts +++ b/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts @@ -4,7 +4,6 @@ import { objectClone } from '../../tools/index' import { heritageContenuFind, titreEtapeHeritageContenuFind } from './titre-etape-heritage-contenu-find' import { describe, test, expect } from 'vitest' -import { DeepReadonly } from 'camino-common/src/typescript-tools' import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' import { newEtapeId } from '../../database/models/_format/id-create' @@ -158,7 +157,7 @@ describe('retourne le contenu de l’étape en fonction de son héritage', () => } as ITitreEtape titreEtape.heritageContenu!.section!.element!.actif = true - const dictionary: Record<string, DeepReadonly<Section>[]> = { + const dictionary: Record<string, Section[]> = { [prevTitreEtape.id]: [ { id: 'section', @@ -198,7 +197,7 @@ describe('retourne le contenu de l’étape en fonction de son héritage', () => } as ITitreEtape titreEtape.heritageContenu!.section!.element!.actif = true - const dictionary: Record<string, DeepReadonly<Section>[]> = { + const dictionary: Record<string, Section[]> = { [prevTitreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }], [titreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }], } @@ -230,7 +229,7 @@ describe('retourne le contenu de l’étape en fonction de son héritage', () => titreEtape.heritageContenu!.section!.element!.actif = true titreEtape.heritageContenu!.section!.element!.etapeId = newEtapeId('prevEtapeId') - const dictionary: Record<string, DeepReadonly<Section>[]> = { + const dictionary: Record<string, Section[]> = { [prevTitreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }], [titreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }], } @@ -262,7 +261,7 @@ describe('retourne le contenu de l’étape en fonction de son héritage', () => titreEtape.heritageContenu!.section!.element!.actif = true titreEtape.heritageContenu!.section!.element!.etapeId = newEtapeId('prevEtapeId') - const dictionary: Record<string, DeepReadonly<Section>[]> = { + const dictionary: Record<string, Section[]> = { [prevTitreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }], [titreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }], } diff --git a/packages/api/src/business/utils/titre-etape-heritage-contenu-find.ts b/packages/api/src/business/utils/titre-etape-heritage-contenu-find.ts index c767f9b5b9636b7bd66bb55f1adbc8a945549568..c1f42feef4fdfaff9df6f444b132a63ba313f958 100644 --- a/packages/api/src/business/utils/titre-etape-heritage-contenu-find.ts +++ b/packages/api/src/business/utils/titre-etape-heritage-contenu-find.ts @@ -1,6 +1,6 @@ import { IContenuValeur, ITitreEtape } from '../../types' -import { DeepReadonly, RecordPartial } from 'camino-common/src/typescript-tools' +import { RecordPartial } from 'camino-common/src/typescript-tools' import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' export const heritageContenuFind = ( @@ -53,7 +53,7 @@ export const heritageContenuFind = ( export const titreEtapeHeritageContenuFind = ( titreEtapes: Omit<ITitreEtape, 'titreDemarcheId' | 'isBrouillon'>[], titreEtape: Pick<ITitreEtape, 'id' | 'contenu' | 'heritageContenu'>, - etapeSectionsDictionary: RecordPartial<string, DeepReadonly<Section[]>> + etapeSectionsDictionary: RecordPartial<string, Section[]> ) => { const sections = etapeSectionsDictionary[titreEtape.id] diff --git a/packages/api/src/business/validations/titre-demarche-etat-validate.ts b/packages/api/src/business/validations/titre-demarche-etat-validate.ts index 3b962594fa8133d332fa914a85a3877ae4295e83..fa5a105d86fa49040836a6662a321a69468d8218 100644 --- a/packages/api/src/business/validations/titre-demarche-etat-validate.ts +++ b/packages/api/src/business/validations/titre-demarche-etat-validate.ts @@ -1,5 +1,5 @@ // valide la date et la position de l'étape en fonction des autres étapes -import { DeepReadonly, NonEmptyArray, isNonEmptyArray, isNotNullNorUndefined, isNullOrUndefined, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools' +import { NonEmptyArray, isNonEmptyArray, isNotNullNorUndefined, isNullOrUndefined, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools' import type { ITitreEtape } from '../../types' import { Etape, TitreEtapeForMachine, titreEtapeForMachineValidator, toMachineEtapes } from '../rules-demarches/machine-common' @@ -15,14 +15,14 @@ import { getEtapesTDE, isTDEExist } from 'camino-common/src/static/titresTypes_d import { etapeTypeDateFinCheck } from '../../api/_format/etapes-types' import { getEtapesStatuts } from 'camino-common/src/static/etapesTypesEtapesStatuts' -const titreDemarcheEtapesBuild = <T extends Pick<Partial<ITitreEtape>, 'id'>>(titreEtape: DeepReadonly<T>, suppression: boolean, titreDemarcheEtapes?: DeepReadonly<T[]> | null): DeepReadonly<T[]> => { +const titreDemarcheEtapesBuild = <T extends Pick<Partial<ITitreEtape>, 'id'>>(titreEtape: T, suppression: boolean, titreDemarcheEtapes?: T[] | null): T[] => { if (isNullOrUndefinedOrEmpty(titreDemarcheEtapes)) { return [titreEtape] } // si nous n’ajoutons pas une nouvelle étape // on supprime l’étape en cours de modification ou de suppression - const titreEtapes = titreDemarcheEtapes.reduce((acc: DeepReadonly<T[]>, te) => { + const titreEtapes = titreDemarcheEtapes.reduce((acc: T[], te) => { if (te.id !== titreEtape.id) { acc = [...acc, te] } diff --git a/packages/api/src/business/validations/titre-etape-updation-validate.ts b/packages/api/src/business/validations/titre-etape-updation-validate.ts index fa398149171a96ba014a4c235360e66ae4cc68c9..eba3f87162534e4550b4b8d1a222e6392fe1976c 100644 --- a/packages/api/src/business/validations/titre-etape-updation-validate.ts +++ b/packages/api/src/business/validations/titre-etape-updation-validate.ts @@ -10,7 +10,7 @@ import { getSections } from 'camino-common/src/static/titresTypes_demarchesTypes import { EntrepriseDocument, EntrepriseId } from 'camino-common/src/entreprise' import { ETAPE_IS_NOT_BROUILLON, EtapeAvis, EtapeDocument } from 'camino-common/src/etape' import { CommuneId } from 'camino-common/src/static/communes' -import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools' import { flattenContenuToSimpleContenu } from 'camino-common/src/sections' import { equalGeojson } from 'camino-common/src/perimetre' import { ApiFlattenEtape } from '../../api/_format/titres-etapes' @@ -20,12 +20,12 @@ export const titreEtapeUpdationValidate = ( etape: Pick<Partial<ApiFlattenEtape>, 'id'> & Omit<ApiFlattenEtape, 'id'>, titreDemarche: ITitreDemarche, titre: Pick<ITitre, 'typeId' | 'demarches'>, - documents: DeepReadonly<Pick<EtapeDocument, 'etape_document_type_id'>[]>, - etapeAvis: DeepReadonly<Pick<EtapeAvis, 'avis_type_id'>[]>, + documents: Pick<EtapeDocument, 'etape_document_type_id'>[], + etapeAvis: Pick<EtapeAvis, 'avis_type_id'>[], entrepriseDocuments: Pick<EntrepriseDocument, 'entreprise_document_type_id' | 'entreprise_id'>[], - sdomZones: DeepReadonly<SDOMZoneId[]> | null | undefined, + sdomZones: SDOMZoneId[] | null | undefined, communes: CommuneId[] | null | undefined, - user: DeepReadonly<User>, + user: User, firstEtapeDate: FirstEtapeDate, titreEtapeOld?: ITitreEtape ): string[] => { diff --git a/packages/api/src/business/validations/utils/contenu-dates-check.test.ts b/packages/api/src/business/validations/utils/contenu-dates-check.test.ts index f325a87e3e888e07a5c34c98c46f08c0e3669336..4e5e31bc4e7b18d3fa5b333f6ee753223fe51c27 100644 --- a/packages/api/src/business/validations/utils/contenu-dates-check.test.ts +++ b/packages/api/src/business/validations/utils/contenu-dates-check.test.ts @@ -1,10 +1,9 @@ import { contenuDatesCheck } from './contenu-dates-check' import { describe, test, expect } from 'vitest' import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' -import { DeepReadonly } from 'camino-common/src/typescript-tools' import { CaminoDate } from 'camino-common/src/date' -const sections: DeepReadonly<Section[]> = [ +const sections: Section[] = [ { id: 'section', elements: [ diff --git a/packages/api/src/business/validations/utils/contenu-dates-check.ts b/packages/api/src/business/validations/utils/contenu-dates-check.ts index fb86a52953477a506c94e1c4d2735d62981822a6..a9a0d5937ce418d7f9a12e317c457eb128b96327 100644 --- a/packages/api/src/business/validations/utils/contenu-dates-check.ts +++ b/packages/api/src/business/validations/utils/contenu-dates-check.ts @@ -1,9 +1,9 @@ import { caminoDateValidator } from 'camino-common/src/date' import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' -import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, RecordPartial } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, RecordPartial } from 'camino-common/src/typescript-tools' import { FlattenedContenuElement } from 'camino-common/src/etape-form' -export const contenuDatesCheck = (sections: DeepReadonly<Section[]>, contenu: RecordPartial<string, RecordPartial<string, Pick<FlattenedContenuElement, 'value'>>>): string | null => { +export const contenuDatesCheck = (sections: Section[], contenu: RecordPartial<string, RecordPartial<string, Pick<FlattenedContenuElement, 'value'>>>): string | null => { const errors = sections.reduce( (errors: string[], section) => isNotNullNorUndefinedNorEmpty(section.elements) && isNotNullNorUndefined(contenu[section.id]) diff --git a/packages/api/src/business/validations/utils/contenu-numbers-check.ts b/packages/api/src/business/validations/utils/contenu-numbers-check.ts index b135f118d882f23e0b78741cea2d12f71722113a..f2a3f564300dd90ae42843425f909c60d0202a85 100644 --- a/packages/api/src/business/validations/utils/contenu-numbers-check.ts +++ b/packages/api/src/business/validations/utils/contenu-numbers-check.ts @@ -1,9 +1,9 @@ import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' -import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefinedOrEmpty, RecordPartial } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNullOrUndefinedOrEmpty, RecordPartial } from 'camino-common/src/typescript-tools' import { numberElementValueValidator } from 'camino-common/src/sections' import { FlattenedContenuElement } from 'camino-common/src/etape-form' -export const contenuNumbersCheck = (sections: DeepReadonly<Section[]>, contenu: RecordPartial<string, RecordPartial<string, Pick<FlattenedContenuElement, 'value'>>>): string | null => { +export const contenuNumbersCheck = (sections: Section[], contenu: RecordPartial<string, RecordPartial<string, Pick<FlattenedContenuElement, 'value'>>>): string | null => { const errors = sections.reduce((errors: string[], section) => { if (isNullOrUndefinedOrEmpty(section.elements)) return errors diff --git a/packages/api/src/database/queries/communes.queries.ts b/packages/api/src/database/queries/communes.queries.ts index 23f6dd253f7842d9c54ce12db18618a3eba11107..b66a80f500fe7dacb733bd07d165e346f489be6f 100644 --- a/packages/api/src/database/queries/communes.queries.ts +++ b/packages/api/src/database/queries/communes.queries.ts @@ -2,7 +2,7 @@ import { sql } from '@pgtyped/runtime' import { EffectDbQueryAndValidateErrors, Redefine, dbQueryAndValidate, effectDbQueryAndValidate } from '../../pg-database' import { IGetCommuneIdsInternalQuery, IGetCommunesInternalQuery, IInsertCommuneInternalQuery } from './communes.queries.types' import { CommuneId, Commune, communeValidator } from 'camino-common/src/static/communes' -import { DeepReadonly, NonEmptyArray } from 'camino-common/src/typescript-tools' +import { NonEmptyArray } from 'camino-common/src/typescript-tools' import { Pool } from 'pg' import { z } from 'zod' import { CaminoError } from 'camino-common/src/zod-tools' @@ -12,7 +12,7 @@ export const getCommunes = (pool: Pool, params: { ids: NonEmptyArray<CommuneId> return effectDbQueryAndValidate(getCommunesInternal, params, pool, communeValidator) } -const getCommunesInternal = sql<Redefine<IGetCommunesInternalQuery, DeepReadonly<{ ids: NonEmptyArray<CommuneId> }>, Commune>>` +const getCommunesInternal = sql<Redefine<IGetCommunesInternalQuery, { ids: NonEmptyArray<CommuneId> }, Commune>>` select id, nom diff --git a/packages/api/src/database/queries/entreprises.ts b/packages/api/src/database/queries/entreprises.ts index 17edb538c8ea72a91ccf89da1e635a787b260b8f..8035486f86e7cb94971fa5e4af90375e8d0f95e5 100644 --- a/packages/api/src/database/queries/entreprises.ts +++ b/packages/api/src/database/queries/entreprises.ts @@ -11,7 +11,7 @@ import Entreprises from '../models/entreprises' import { entreprisesQueryModify } from './permissions/entreprises' import { User } from 'camino-common/src/roles' import { EntrepriseId } from 'camino-common/src/entreprise' -import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' const entreprisesFiltersQueryModify = ( { @@ -47,7 +47,7 @@ const entreprisesFiltersQueryModify = ( } } -const entreprisesQueryBuild = ({ fields }: { fields?: FieldsEntreprise }, user: DeepReadonly<User>) => { +const entreprisesQueryBuild = ({ fields }: { fields?: FieldsEntreprise }, user: User) => { const graph = fields ? graphBuild(fields, 'entreprises', fieldsFormat) : options.entreprises.graph const q = Entreprises.query().withGraphFetched(graph) @@ -57,7 +57,7 @@ const entreprisesQueryBuild = ({ fields }: { fields?: FieldsEntreprise }, user: return q } -export const entrepriseGet = async (id: EntrepriseId, { fields }: { fields?: FieldsEntreprise }, user: DeepReadonly<User>): Promise<IEntreprise | undefined> => { +export const entrepriseGet = async (id: EntrepriseId, { fields }: { fields?: FieldsEntreprise }, user: User): Promise<IEntreprise | undefined> => { const q = entreprisesQueryBuild({ fields }, user) return (await q.findById(id)) as IEntreprise diff --git a/packages/api/src/database/queries/permissions/entreprises.ts b/packages/api/src/database/queries/permissions/entreprises.ts index bfa5bcd708eeb6091b3c37f7132cc86efd9dcc8e..1a402073b6d462124a027e206174403d299d7258 100644 --- a/packages/api/src/database/queries/permissions/entreprises.ts +++ b/packages/api/src/database/queries/permissions/entreprises.ts @@ -5,9 +5,8 @@ import { knex } from '../../../knex' import Entreprises from '../../models/entreprises' import { User } from 'camino-common/src/roles' import TitresEtapes from '../../models/titres-etapes' -import { DeepReadonly } from 'camino-common/src/typescript-tools' -export const entreprisesQueryModify = (q: QueryBuilder<Entreprises, Entreprises | Entreprises[]>, _user: DeepReadonly<User>): QueryBuilder<Entreprises, Entreprises | Entreprises[]> => { +export const entreprisesQueryModify = (q: QueryBuilder<Entreprises, Entreprises | Entreprises[]>, _user: User): QueryBuilder<Entreprises, Entreprises | Entreprises[]> => { q.select('entreprises.*') return q diff --git a/packages/api/src/database/queries/permissions/journaux.ts b/packages/api/src/database/queries/permissions/journaux.ts index dfc86a6cb4fd159326ba60c32790b7f60d251f94..85b6f8948bc13653e0990eef321afa53c4f21bde 100644 --- a/packages/api/src/database/queries/permissions/journaux.ts +++ b/packages/api/src/database/queries/permissions/journaux.ts @@ -2,9 +2,8 @@ import { QueryBuilder } from 'objection' import Journaux from '../../models/journaux' import { isSuper, User } from 'camino-common/src/roles' -import { DeepReadonly } from 'camino-common/src/typescript-tools' -export const journauxQueryModify = (q: QueryBuilder<Journaux, Journaux | Journaux[]>, user: DeepReadonly<User>): QueryBuilder<Journaux, Journaux | Journaux[]> => { +export const journauxQueryModify = (q: QueryBuilder<Journaux, Journaux | Journaux[]>, user: User): QueryBuilder<Journaux, Journaux | Journaux[]> => { q.select('journaux.*') // Les journaux sont uniquement visibles par les super diff --git a/packages/api/src/database/queries/permissions/titres-activites.ts b/packages/api/src/database/queries/permissions/titres-activites.ts index 85df25068fe6f6ed4843bfa040936075524b9ce0..57f9dd008a1a16916990fe5dcc63fc0a27a99da5 100644 --- a/packages/api/src/database/queries/permissions/titres-activites.ts +++ b/packages/api/src/database/queries/permissions/titres-activites.ts @@ -5,9 +5,8 @@ import TitresActivites from '../../models/titres-activites' import { administrationsTitresQuery } from './administrations' import { entreprisesTitresQuery } from './entreprises' import { isAdministration, isEntreprise, isSuper, User } from 'camino-common/src/roles' -import { DeepReadonly } from 'camino-common/src/typescript-tools' -export const titresActivitesQueryModify = (q: QueryBuilder<TitresActivites, TitresActivites | TitresActivites[]>, user: DeepReadonly<User>) => { +export const titresActivitesQueryModify = (q: QueryBuilder<TitresActivites, TitresActivites | TitresActivites[]>, user: User) => { q.select('titresActivites.*') q.leftJoinRelated('titre') diff --git a/packages/api/src/database/queries/permissions/titres-demarches.ts b/packages/api/src/database/queries/permissions/titres-demarches.ts index 5c54c3638018cc2eb44e58b5cf83b0f3883fa1bb..ac3c8519e27a913cb90a4b57807f93dc2269210b 100644 --- a/packages/api/src/database/queries/permissions/titres-demarches.ts +++ b/packages/api/src/database/queries/permissions/titres-demarches.ts @@ -9,9 +9,8 @@ import { titresQueryModify } from './titres' import { administrationsTitresQuery } from './administrations' import { entreprisesTitresQuery } from './entreprises' import { isSuper, isAdministration, isEntreprise, isBureauDEtudes, User } from 'camino-common/src/roles' -import { DeepReadonly } from 'camino-common/src/typescript-tools' -export const titresDemarchesQueryModify = (q: QueryBuilder<TitresDemarches, TitresDemarches | TitresDemarches[]>, user: DeepReadonly<User>) => { +export const titresDemarchesQueryModify = (q: QueryBuilder<TitresDemarches, TitresDemarches | TitresDemarches[]>, user: User) => { q.select('titresDemarches.*').where('titresDemarches.archive', false).leftJoinRelated('titre') if (!isSuper(user)) { diff --git a/packages/api/src/database/queries/permissions/titres-etapes.ts b/packages/api/src/database/queries/permissions/titres-etapes.ts index c65e08cbde70898e5706ac585892b91bdb3d8e0e..5d98c56fc412ca0f0326a4167888e160feb4e5cf 100644 --- a/packages/api/src/database/queries/permissions/titres-etapes.ts +++ b/packages/api/src/database/queries/permissions/titres-etapes.ts @@ -12,7 +12,6 @@ import { isAdministration, isBureauDEtudes, isEntreprise, isSuper, User } from ' import { getAdministrationTitresTypesEtapesTypes } from 'camino-common/src/static/administrationsTitresTypesEtapesTypes' import { knex } from '../../../knex' import { EtapeTypeId, etapesTypes } from 'camino-common/src/static/etapesTypes' -import { DeepReadonly } from 'camino-common/src/typescript-tools' /** * Modifie la requête d'étape(s) pour prendre en compte les permissions de l'utilisateur connecté @@ -21,7 +20,7 @@ import { DeepReadonly } from 'camino-common/src/typescript-tools' * @params user - utilisateur connecté * @returns une requête d'étape(s) */ -export const titresEtapesQueryModify = (q: QueryBuilder<TitresEtapes, TitresEtapes | TitresEtapes[]>, user: DeepReadonly<User>) => { +export const titresEtapesQueryModify = (q: QueryBuilder<TitresEtapes, TitresEtapes | TitresEtapes[]>, user: User) => { q.select('titresEtapes.*').where('titresEtapes.archive', false).leftJoinRelated('[demarche.titre]') if (!isSuper(user)) { diff --git a/packages/api/src/database/queries/permissions/titres.ts b/packages/api/src/database/queries/permissions/titres.ts index 1cccfde6b659e8877c3a04501b6a87ca2beeb3b4..72f8bb85bef4bad3cf022b8eced970182138df54 100644 --- a/packages/api/src/database/queries/permissions/titres.ts +++ b/packages/api/src/database/queries/permissions/titres.ts @@ -10,7 +10,7 @@ import { administrationsTitresQuery } from './administrations' import { entreprisesTitresQuery } from './entreprises' import TitresEtapes from '../../models/titres-etapes' import { isAdministration, isBureauDEtudes, isEntreprise, isSuper, User } from 'camino-common/src/roles' -import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' export const titresVisibleByEntrepriseQuery = (q: QueryBuilder<Titres, Titres | Titres[]>, entreprisesIds: string[]) => { // titres dont il est titulaire ou amodiataire @@ -51,7 +51,7 @@ export const titresConfidentielSelect = (q: QueryBuilder<Titres, Titres | Titres .as('confidentiel') ) -export const titresQueryModify = (q: QueryBuilder<Titres, Titres | Titres[]>, user: DeepReadonly<User>, demandeEnCours?: boolean | null) => { +export const titresQueryModify = (q: QueryBuilder<Titres, Titres | Titres[]>, user: User, demandeEnCours?: boolean | null) => { q.select('titres.*').where('titres.archive', false) // si diff --git a/packages/api/src/database/queries/titres-demarches.ts b/packages/api/src/database/queries/titres-demarches.ts index a493b340b84b83440d28991735850a3d2fc3444f..b39e23155c3aabc4b7867ed615432a976e4fdb69 100644 --- a/packages/api/src/database/queries/titres-demarches.ts +++ b/packages/api/src/database/queries/titres-demarches.ts @@ -14,7 +14,7 @@ import { titresFiltersQueryModify } from './_titres-filters' import TitresEtapes from '../models/titres-etapes' import { User } from 'camino-common/src/roles' import { sortedDemarchesTypes } from 'camino-common/src/static/demarchesTypes' -import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' const etapesIncluesExcluesBuild = (q: QueryBuilder<TitresDemarches, TitresDemarches[]>, etapes: ITitreEtapeFiltre[], mode: 'etapesInclues' | 'etapesExclues') => { const raw = etapes @@ -126,7 +126,7 @@ const titresDemarchesFiltersQueryModify = ( ) } -const titresDemarchesQueryBuild = ({ fields }: { fields?: FieldsDemarche }, user: DeepReadonly<User>) => { +const titresDemarchesQueryBuild = ({ fields }: { fields?: FieldsDemarche }, user: User) => { const graph = fields ? graphBuild(fieldsTitreAdd(fields), 'demarches', fieldsFormat) : options.titresDemarches.graph const q = TitresDemarches.query().withGraphFetched(graph) @@ -303,7 +303,7 @@ export const titresDemarchesGet = async ( return q } -export const titreDemarcheGet = async (titreDemarcheId: string, { fields }: { fields?: FieldsDemarche }, user: DeepReadonly<User>): Promise<ITitreDemarche | undefined> => { +export const titreDemarcheGet = async (titreDemarcheId: string, { fields }: { fields?: FieldsDemarche }, user: User): Promise<ITitreDemarche | undefined> => { const q = titresDemarchesQueryBuild({ fields }, user) return q diff --git a/packages/api/src/database/queries/titres-etapes.queries.ts b/packages/api/src/database/queries/titres-etapes.queries.ts index d035f8a0bc9d6c972e63e9d44394d3aa09fe95e7..034086e3fde823e357a838be42e5720befb3a1af 100644 --- a/packages/api/src/database/queries/titres-etapes.queries.ts +++ b/packages/api/src/database/queries/titres-etapes.queries.ts @@ -51,7 +51,7 @@ import { canReadDocument } from '../../api/rest/permissions/documents' import { AdministrationId } from 'camino-common/src/static/administrations' import { ETAPES_WITH_AUTOMATIC_STATUTS, EtapeTypeId, etapeTypeIdValidator } from 'camino-common/src/static/etapesTypes' import { TitreTypeId, titreTypeIdValidator } from 'camino-common/src/static/titresTypes' -import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, SimplePromiseFn } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, SimplePromiseFn } from 'camino-common/src/typescript-tools' import { CanReadDemarche } from '../../api/rest/permissions/demarches' import { newEtapeAvisId, newEtapeDocumentId } from '../models/_format/id-create' import { caminoDateValidator, FirstEtapeDate, getCurrent } from 'camino-common/src/date' @@ -146,7 +146,7 @@ export type UpdateEtapeDocumentsErrors = EffectDbQueryAndValidateErrors | Insert export const updateEtapeDocuments = ( pool: Pool, titre_etape_id: EtapeId, - etapeDocuments: DeepReadonly<EtapeDocumentModification[]> + etapeDocuments: EtapeDocumentModification[] ): Effect.Effect<Option.Option<never>, CaminoError<UpdateEtapeDocumentsErrors>> => { return Effect.Do.pipe( Effect.bind('documentsInDb', () => effectDbQueryAndValidate(getDocumentsByEtapeIdQuery, { titre_etape_id }, pool, getDocumentsByEtapeIdQueryValidator)), @@ -214,14 +214,14 @@ set where id = $ id ! ` -const deleteEtapeDocumentsDb = sql<Redefine<IDeleteEtapeDocumentsDbQuery, { ids: DeepReadonly<EtapeDocumentId[]> }, void>>` +const deleteEtapeDocumentsDb = sql<Redefine<IDeleteEtapeDocumentsDbQuery, { ids: EtapeDocumentId[] }, void>>` delete from etapes_documents where id in $$ ids ! ` const largeObjectIdError = 'impossible de récupérer un large object id' as const export type InsertEtapeDocumentsErrors = EffectDbQueryAndValidateErrors | typeof largeObjectIdError -export const insertEtapeDocuments = (pool: Pool, titre_etape_id: EtapeId, etapeDocuments: DeepReadonly<TempEtapeDocument[]>): Effect.Effect<true, CaminoError<InsertEtapeDocumentsErrors>> => { +export const insertEtapeDocuments = (pool: Pool, titre_etape_id: EtapeId, etapeDocuments: TempEtapeDocument[]): Effect.Effect<true, CaminoError<InsertEtapeDocumentsErrors>> => { return Effect.Do.pipe( Effect.flatMap(() => Effect.forEach(etapeDocuments, document => { @@ -247,7 +247,7 @@ insert into etapes_documents (id, etape_document_type_id, etape_id, description, ` const impossibleDeCreerUnLargeObjectId = 'impossible de créer un large object id' as const export type InsertEtapeAvisErrors = EffectDbQueryAndValidateErrors | typeof impossibleDeCreerUnLargeObjectId -export const insertEtapeAvis = (pool: Pool, titre_etape_id: EtapeId, etapeAvis: DeepReadonly<TempEtapeAvis[]>): Effect.Effect<true, CaminoError<InsertEtapeAvisErrors>> => +export const insertEtapeAvis = (pool: Pool, titre_etape_id: EtapeId, etapeAvis: TempEtapeAvis[]): Effect.Effect<true, CaminoError<InsertEtapeAvisErrors>> => Effect.Do.pipe( Effect.flatMap(() => Effect.forEach(etapeAvis, avis => { @@ -284,7 +284,7 @@ set where id = $ id ! ` -const deleteEtapeAvisDb = sql<Redefine<IDeleteEtapeAvisDbQuery, { ids: DeepReadonly<EtapeAvisId[]> }, void>>` +const deleteEtapeAvisDb = sql<Redefine<IDeleteEtapeAvisDbQuery, { ids: EtapeAvisId[] }, void>>` delete from etape_avis where id in $$ ids ! ` @@ -294,13 +294,13 @@ export const updateEtapeAvis = ( pool: Pool, titre_etape_id: EtapeId, isBrouillon: EtapeBrouillon, - etapeAvis: DeepReadonly<EtapeAvisModification[]>, + etapeAvis: EtapeAvisModification[], etapeTypeId: EtapeTypeId, titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, demarcheId: DemarcheId, firstEtapeDate: FirstEtapeDate, - communeIds: DeepReadonly<CommuneId[]> + communeIds: CommuneId[] ): Effect.Effect<Option.Option<never>, CaminoError<UpdateEtapeAvisErrors>> => { return Effect.Do.pipe( Effect.filterOrFail( diff --git a/packages/api/src/database/queries/titres-etapes.ts b/packages/api/src/database/queries/titres-etapes.ts index e26f062d1f071aa9cfd3cb1858a4a9ef89dbba49..f00b7c068d60503f6f3e5b80c80f73c9db6eb4a7 100644 --- a/packages/api/src/database/queries/titres-etapes.ts +++ b/packages/api/src/database/queries/titres-etapes.ts @@ -9,10 +9,9 @@ import { createJournalCreate, patchJournalCreate, upsertJournalCreate } from './ import { User, UserNotNull } from 'camino-common/src/roles' import { TitreId } from 'camino-common/src/validators/titres' import { EtapeId, EtapeIdOrSlug } from 'camino-common/src/etape' -import { DeepReadonly } from 'camino-common/src/typescript-tools' import { DemarcheId } from 'camino-common/src/demarche' -const titresEtapesQueryBuild = ({ fields }: { fields?: FieldsEtape }, user: DeepReadonly<User>) => { +const titresEtapesQueryBuild = ({ fields }: { fields?: FieldsEtape }, user: User) => { const graph = fields ? graphBuild(fields, 'etapes', fieldsFormat) : '[]' const q = TitresEtapes.query().withGraphFetched(graph) @@ -23,7 +22,7 @@ const titresEtapesQueryBuild = ({ fields }: { fields?: FieldsEtape }, user: Deep } // utilisé dans le daily et le resolver des documents uniquement -export const titreEtapeGet = async (titreEtapeId: EtapeIdOrSlug, { fields, fetchHeritage }: { fields?: FieldsEtape; fetchHeritage?: boolean }, user: DeepReadonly<User>): Promise<ITitreEtape> => { +export const titreEtapeGet = async (titreEtapeId: EtapeIdOrSlug, { fields, fetchHeritage }: { fields?: FieldsEtape; fetchHeritage?: boolean }, user: User): Promise<ITitreEtape> => { const q = titresEtapesQueryBuild({ fields }, user) q.context({ fetchHeritage }) @@ -81,13 +80,13 @@ export const titreEtapeCreate = async ( return newValue } -export const titreEtapeUpdate = async (id: EtapeId, titreEtape: Partial<DBTitresEtapes>, user: DeepReadonly<UserNotNull>, titreId: TitreId): Promise<TitresEtapes> => { +export const titreEtapeUpdate = async (id: EtapeId, titreEtape: Partial<DBTitresEtapes>, user: UserNotNull, titreId: TitreId): Promise<TitresEtapes> => { return patchJournalCreate(id, titreEtape, user.id, titreId) } export const titreEtapeUpsert = async ( - titreEtape: DeepReadonly<Partial<Pick<ITitreEtape, 'id'>> & Omit<ITitreEtape, 'id' | 'concurrence' | 'hasTitreFrom'>>, - user: DeepReadonly<UserNotNull>, + titreEtape: Partial<Pick<ITitreEtape, 'id'> & Omit<ITitreEtape, 'id' | 'concurrence' | 'hasTitreFrom'>>, + user: UserNotNull, titreId: TitreId ): Promise<ITitreEtape | undefined> => upsertJournalCreate( diff --git a/packages/api/src/database/queries/titres-titres.queries.ts b/packages/api/src/database/queries/titres-titres.queries.ts index 2df3786aee903f7388b5d38b8c89d906ef92559f..5fa43ee2b079fc28d671e3319442002aaf72ab30 100644 --- a/packages/api/src/database/queries/titres-titres.queries.ts +++ b/packages/api/src/database/queries/titres-titres.queries.ts @@ -7,14 +7,13 @@ import { CaminoError } from 'camino-common/src/zod-tools.js' import { Pool } from 'pg' import { z } from 'zod' import { ZodUnparseable } from '../../tools/fp-tools.js' -import { DeepReadonly } from 'camino-common/src/typescript-tools.js' interface LinkTitre { linkTo: TitreId linkFrom: TitreId[] } export type LinkTitresErrors = DbQueryAccessError | ZodUnparseable -export const linkTitres = (pool: Pool, link: DeepReadonly<LinkTitre>): Effect.Effect<void, CaminoError<LinkTitresErrors>> => { +export const linkTitres = (pool: Pool, link: LinkTitre): Effect.Effect<void, CaminoError<LinkTitresErrors>> => { return pipe( effectDbQueryAndValidate(deleteTitreTitreInternal, { linkTo: link.linkTo }, pool, z.void()), Effect.flatMap(() => { diff --git a/packages/api/src/database/queries/titres.ts b/packages/api/src/database/queries/titres.ts index 0e8ce29b7a35d0ce6b4a94a1da2fd2b6b14793ca..97bb0b7d8599d6612bb5a570a0386add13f46c15 100644 --- a/packages/api/src/database/queries/titres.ts +++ b/packages/api/src/database/queries/titres.ts @@ -19,7 +19,6 @@ import { DepartementId } from 'camino-common/src/static/departement' import { RegionId } from 'camino-common/src/static/region' import { FacadesMaritimes } from 'camino-common/src/static/facades' import { TitreId } from 'camino-common/src/validators/titres' -import { DeepReadonly } from 'camino-common/src/typescript-tools' /** * Construit la requête pour récupérer certains champs de titres filtrés @@ -30,7 +29,7 @@ import { DeepReadonly } from 'camino-common/src/typescript-tools' * @returns la requête * */ -const titresQueryBuild = ({ fields }: { fields?: FieldsTitre }, user: DeepReadonly<User>, demandeEnCours?: boolean | null) => { +const titresQueryBuild = ({ fields }: { fields?: FieldsTitre }, user: User, demandeEnCours?: boolean | null) => { const graph = fields ? graphBuild(titresFieldsAdd(fields), 'titre', fieldsFormat) : options.titres.graph const q = Titres.query().withGraphFetched(graph) @@ -49,7 +48,7 @@ const titresQueryBuild = ({ fields }: { fields?: FieldsTitre }, user: DeepReadon * @returns un titre * */ -export const titreGet = async (id: string, { fields }: { fields?: FieldsTitre }, user: DeepReadonly<User>): Promise<DBTitre | undefined> => { +export const titreGet = async (id: string, { fields }: { fields?: FieldsTitre }, user: User): Promise<DBTitre | undefined> => { const q = titresQueryBuild({ fields }, user) return q @@ -119,7 +118,7 @@ export const titresGet = async ( demandeEnCours?: boolean | null } = {}, { fields }: { fields?: FieldsTitre }, - user: DeepReadonly<User> + user: User ): Promise<ITitre[]> => { const q = titresQueryBuild({ fields }, user, demandeEnCours) diff --git a/packages/api/src/database/queries/utilisateurs.queries.ts b/packages/api/src/database/queries/utilisateurs.queries.ts index 6170bfd20a8d98aa86afab3205cd7850e9ca8aa2..10b9426e1911f208b2de7c32a97adb34c81a95fe 100644 --- a/packages/api/src/database/queries/utilisateurs.queries.ts +++ b/packages/api/src/database/queries/utilisateurs.queries.ts @@ -35,7 +35,7 @@ import { IUpdateUtilisateurRoleDbQuery, } from './utilisateurs.queries.types' import { ZodUnparseable, callAndExit, zodParseEffect } from '../../tools/fp-tools' -import { DeepReadonly, NonEmptyArray, Nullable, isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools' +import { NonEmptyArray, Nullable, isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools' import { EntrepriseId, entrepriseIdValidator } from 'camino-common/src/entreprise' import { CaminoDate } from 'camino-common/src/date' import { TitreId } from 'camino-common/src/validators/titres' @@ -54,11 +54,7 @@ const getUtilisateursValidator = z.object({ export type GetUtilisateur = z.infer<typeof getUtilisateursValidator> type GetUtilisateursFilteredAndSortedErrors = DbQueryAccessError | ZodUnparseable | 'droits insuffisants' -export const getUtilisateursFilteredAndSorted = ( - pool: Pool, - user: DeepReadonly<User>, - searchParams: UtilisateursSearchParams -): Effect.Effect<UserNotNull[], CaminoError<GetUtilisateursFilteredAndSortedErrors>> => { +export const getUtilisateursFilteredAndSorted = (pool: Pool, user: User, searchParams: UtilisateursSearchParams): Effect.Effect<UserNotNull[], CaminoError<GetUtilisateursFilteredAndSortedErrors>> => { return Effect.Do.pipe( Effect.filterOrFail( () => canReadUtilisateurs(user), @@ -164,17 +160,15 @@ export const getUtilisateurById = async (pool: Pool, id: UtilisateurId, user: Us } const userDbToUser = ( - user: DeepReadonly<GetUtilisateur> -): DeepReadonly< - Pick<UserNotNull, 'telephone_fixe' | 'telephone_mobile' | 'id' | 'nom' | 'prenom' | 'role' | 'email'> & - Nullable<Pick<AdminUserNotNull, 'administrationId'>> & - Pick<EntrepriseUserNotNull, 'entrepriseIds'> -> => { + user: GetUtilisateur +): Pick<UserNotNull, 'telephone_fixe' | 'telephone_mobile' | 'id' | 'nom' | 'prenom' | 'role' | 'email'> & + Nullable<Pick<AdminUserNotNull, 'administrationId'>> & + Pick<EntrepriseUserNotNull, 'entrepriseIds'> => { return { ...user, prenom: user.prenom ?? '', entrepriseIds: user.entreprise_ids ?? [], administrationId: user.administration_id } } export type GetUtilisateurByIdErrors = 'droits insuffisants' | DbQueryAccessError | ZodUnparseable -export const newGetUtilisateurById = (pool: Pool, id: UtilisateurId, user: DeepReadonly<User>): Effect.Effect<UserNotNull, CaminoError<GetUtilisateurByIdErrors>> => { +export const newGetUtilisateurById = (pool: Pool, id: UtilisateurId, user: User): Effect.Effect<UserNotNull, CaminoError<GetUtilisateurByIdErrors>> => { return pipe( effectDbQueryAndValidate(getUtilisateurByIdDb, { id }, pool, getUtilisateursValidator), Effect.filterOrFail( @@ -338,7 +332,7 @@ const createUtilisateurEntrepriseDb = sql<Redefine<ICreateUtilisateurEntrepriseD const deleteUtilisateurEntrepriseDb = sql<Redefine<IDeleteUtilisateurEntrepriseDbQuery, { utilisateur_id: UtilisateurId }, void>>` delete from utilisateurs__entreprises where utilisateur_id = $utilisateur_id!` -export const updateUtilisateur = async (pool: Pool, user: DeepReadonly<UserNotNull>): Promise<DeepReadonly<UserNotNull>> => { +export const updateUtilisateur = async (pool: Pool, user: UserNotNull): Promise<UserNotNull> => { await dbQueryAndValidate(updateUtilisateurDb, user, pool, z.void()) return user @@ -348,7 +342,7 @@ const updateUtilisateurDb = sql<Redefine<IUpdateUtilisateurDbQuery, Pick<UserNot update utilisateurs set nom = $nom!, prenom = $prenom!, email = $email! where id = $id! ` -type UpdateUtilisateurRole = DeepReadonly<Pick<UserNotNull, 'id' | 'role'> & Nullable<Pick<AdminUserNotNull, 'administrationId'>> & Pick<EntrepriseUserNotNull, 'entrepriseIds'>> +type UpdateUtilisateurRole = Pick<UserNotNull, 'id' | 'role'> & Nullable<Pick<AdminUserNotNull, 'administrationId'>> & Pick<EntrepriseUserNotNull, 'entrepriseIds'> export const updateUtilisateurRole = async (pool: Pool, user: UpdateUtilisateurRole): Promise<void> => { await dbQueryAndValidate(updateUtilisateurRoleDb, user, pool, z.void()) diff --git a/packages/api/src/pg-database.ts b/packages/api/src/pg-database.ts index 44b9c4e43d21ca49c51b52b9c93ab3921e60e795..6a4a68801e15382735a265b39879d082a0ba7823 100644 --- a/packages/api/src/pg-database.ts +++ b/packages/api/src/pg-database.ts @@ -6,7 +6,6 @@ import type { ZodType, ZodTypeDef } from 'zod' import { CaminoError } from 'camino-common/src/zod-tools' import { ZodUnparseable, zodParseEffectCallback } from './tools/fp-tools' import { Effect, pipe } from 'effect' -import { DeepReadonly } from 'camino-common/src/typescript-tools.js' export type Redefine<T, P, O> = T extends { params: infer A; result: infer B } ? { inputs: keyof A; outputs: keyof B } extends { inputs: keyof P; outputs: keyof O } ? { inputs: keyof P; outputs: keyof O } extends { inputs: keyof A; outputs: keyof B } @@ -34,8 +33,8 @@ export type DBNotFound = typeof dbNotFoundError export type DbQueryAccessError = "Impossible d'exécuter la requête dans la base de données" export type EffectDbQueryAndValidateErrors = DbQueryAccessError | ZodUnparseable export const effectDbQueryAndValidate = <Params, Result, T extends ZodType<Result, ZodTypeDef, unknown>>( - query: TaggedQuery<{ params: DeepReadonly<Params>; result: Result }>, - params: DeepReadonly<Params>, + query: TaggedQuery<{ params: Params; result: Result }>, + params: Params, pool: Pool, validator: T ): Effect.Effect<Result[], CaminoError<EffectDbQueryAndValidateErrors>> => { diff --git a/packages/api/src/server/rest.ts b/packages/api/src/server/rest.ts index bfb7d3d6c2b985a49248e43aaf4cd4b5bd09ef6e..34b101efbd727d63e322475140317b1616a39784 100644 --- a/packages/api/src/server/rest.ts +++ b/packages/api/src/server/rest.ts @@ -57,7 +57,7 @@ import { ZodType, z } from 'zod' import { getCommunes } from '../api/rest/communes' import { SendFileOptions } from 'express-serve-static-core' import { activiteDocumentDownload, getActivite, updateActivite, deleteActivite } from '../api/rest/activites' -import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools' import { getDemarcheByIdOrSlug, demarcheSupprimer, demarcheCreer, getDemarchesEnConcurrence, getResultatEnConcurrence } from '../api/rest/demarches' import { geojsonImport, geojsonImportPoints, getPerimetreInfos, geojsonImportForages } from '../api/rest/perimetre' import { getDataGouvStats } from '../api/rest/statistiques/datagouv' @@ -89,31 +89,31 @@ type IRestResolver = ( ) => Promise<IRestResolverResult | null> type CaminoRestRoutesType = typeof CaminoRestRoutes -type RestGetCall<Route extends GetRestRoutes> = (pool: Pool) => (req: CaminoRequest, res: CustomResponse<DeepReadonly<z.infer<CaminoRestRoutesType[Route]['get']['output']>>>) => Promise<void> +type RestGetCall<Route extends GetRestRoutes> = (pool: Pool) => (req: CaminoRequest, res: CustomResponse<z.infer<CaminoRestRoutesType[Route]['get']['output']>>) => Promise<void> export type RestNewPostCall<Route extends NewPostRestRoutes> = ( data: Effect.Effect< { pool: Pool - user: DeepReadonly<UserNotNull> - body: DeepReadonly<z.infer<CaminoRestRoutesType[Route]['newPost']['input']>> - params: DeepReadonly<z.infer<CaminoRestRoutesType[Route]['params']>> + user: UserNotNull + body: z.infer<CaminoRestRoutesType[Route]['newPost']['input']> + params: z.infer<CaminoRestRoutesType[Route]['params']> }, never, never > -) => Effect.Effect<DeepReadonly<z.infer<CaminoRestRoutesType[Route]['newPost']['output']>>, CaminoApiError<string>> +) => Effect.Effect<z.infer<CaminoRestRoutesType[Route]['newPost']['output']>, CaminoApiError<string>> export type RestNewPutCall<Route extends NewPutRestRoutes> = ( data: Effect.Effect< { pool: Pool - user: DeepReadonly<UserNotNull> - body: DeepReadonly<z.infer<CaminoRestRoutesType[Route]['newPut']['input']>> - params: DeepReadonly<z.infer<CaminoRestRoutesType[Route]['params']>> + user: UserNotNull + body: z.infer<CaminoRestRoutesType[Route]['newPut']['input']> + params: z.infer<CaminoRestRoutesType[Route]['params']> }, never, never > -) => Effect.Effect<DeepReadonly<z.infer<CaminoRestRoutesType[Route]['newPut']['output']>>, CaminoApiError<string>> +) => Effect.Effect<z.infer<CaminoRestRoutesType[Route]['newPut']['output']>, CaminoApiError<string>> type SearchParams<Route extends NewGetRestRoutes> = CaminoRestRoutesType[Route]['newGet'] extends { searchParams: ZodType } ? z.infer<CaminoRestRoutesType[Route]['newGet']['searchParams']> : Record<never, string> @@ -125,15 +125,15 @@ export type RestNewGetCall<Route extends NewGetRestRoutes> = ( data: Effect.Effect< { pool: Pool - user: DeepReadonly<User> - params: DeepReadonly<z.infer<CaminoRestRoutesType[Route]['params']>> + user: User + params: z.infer<CaminoRestRoutesType[Route]['params']> searchParams: SearchParams<Route> cookie: CookieParams }, never, never > -) => Effect.Effect<DeepReadonly<z.infer<CaminoRestRoutesType[Route]['newGet']['output']>>, CaminoApiError<string>> +) => Effect.Effect<z.infer<CaminoRestRoutesType[Route]['newGet']['output']>, CaminoApiError<string>> type RestPostCall<Route extends PostRestRoutes> = (pool: Pool) => (req: CaminoRequest, res: CustomResponse<z.infer<CaminoRestRoutesType[Route]['post']['output']>>) => Promise<void> type RestPutCall<Route extends PutRestRoutes> = (pool: Pool) => (req: CaminoRequest, res: CustomResponse<z.infer<CaminoRestRoutesType[Route]['put']['output']>>) => Promise<void> @@ -269,23 +269,20 @@ export const restWithPool = (dbPool: Pool): Router => { return { ...caminoError, status: HTTP_STATUS.BAD_REQUEST } }), // TODO 2024-06-26 ici, si on ne met pas les params et les searchParams à any, on se retrouve avec une typescript union hell qui fait tout planter - Effect.bind<'result', { searchParams: any; params: any }, DeepReadonly<z.infer<(typeof maRoute)['newGet']['output']>>, CaminoApiError<string>, never>( - 'result', - ({ searchParams, params }) => { - return maRoute.newGetCall( - Effect.Do.pipe( - Effect.let('user', () => req.auth), - Effect.let('pool', () => dbPool), - Effect.let('params', () => params), - Effect.let('searchParams', () => searchParams), - Effect.let('cookie', () => ({ - clearConnectedCookie: () => res.clearCookie('shouldBeConnected'), - addConnectedCookie: () => res.cookie('shouldBeConnected', 'anyValueIsGood, We just check the presence of this cookie'), - })) - ) + Effect.bind<'result', { searchParams: any; params: any }, z.infer<(typeof maRoute)['newGet']['output']>, CaminoApiError<string>, never>('result', ({ searchParams, params }) => { + return maRoute.newGetCall( + Effect.Do.pipe( + Effect.let('user', () => req.auth), + Effect.let('pool', () => dbPool), + Effect.let('params', () => params), + Effect.let('searchParams', () => searchParams), + Effect.let('cookie', () => ({ + clearConnectedCookie: () => res.clearCookie('shouldBeConnected'), + addConnectedCookie: () => res.cookie('shouldBeConnected', 'anyValueIsGood, We just check the presence of this cookie'), + })) ) - } - ), + ) + }), Effect.bind('parsedResult', ({ result }) => pipe( zodParseEffect(maRoute.newGet.output, result), @@ -349,17 +346,15 @@ export const restWithPool = (dbPool: Pool): Router => { return caminoError }), // TODO 2024-06-26 ici, si on ne met pas le body et params à any, on se retrouve avec une typescript union hell qui fait tout planter - Effect.bind<'result', { body: any; user: UserNotNull; params: any }, DeepReadonly<z.infer<(typeof maRoute)['newPost']['output']>>, CaminoApiError<string>, never>( - 'result', - ({ user, body, params }) => - maRoute.newPostCall( - Effect.Do.pipe( - Effect.let('user', () => user), - Effect.let('pool', () => dbPool), - Effect.let('params', () => params), - Effect.let('body', () => body) - ) + Effect.bind<'result', { body: any; user: UserNotNull; params: any }, z.infer<(typeof maRoute)['newPost']['output']>, CaminoApiError<string>, never>('result', ({ user, body, params }) => + maRoute.newPostCall( + Effect.Do.pipe( + Effect.let('user', () => user), + Effect.let('pool', () => dbPool), + Effect.let('params', () => params), + Effect.let('body', () => body) ) + ) ), Effect.bind('parsedResult', ({ result }) => pipe( @@ -422,17 +417,15 @@ export const restWithPool = (dbPool: Pool): Router => { return caminoError }), // TODO 2024-06-26 ici, si on ne met pas le body et params à any, on se retrouve avec une typescript union hell qui fait tout planter - Effect.bind<'result', { body: any; user: UserNotNull; params: any }, DeepReadonly<z.infer<(typeof maRoute)['newPut']['output']>>, CaminoApiError<string>, never>( - 'result', - ({ user, body, params }) => - maRoute.newPutCall( - Effect.Do.pipe( - Effect.let('user', () => user), - Effect.let('pool', () => dbPool), - Effect.let('params', () => params), - Effect.let('body', () => body) - ) + Effect.bind<'result', { body: any; user: UserNotNull; params: any }, z.infer<(typeof maRoute)['newPut']['output']>, CaminoApiError<string>, never>('result', ({ user, body, params }) => + maRoute.newPutCall( + Effect.Do.pipe( + Effect.let('user', () => user), + Effect.let('pool', () => dbPool), + Effect.let('params', () => params), + Effect.let('body', () => body) ) + ) ), Effect.bind('parsedResult', ({ result }) => pipe( diff --git a/packages/api/src/server/user-loader.ts b/packages/api/src/server/user-loader.ts index 7923696ac4bbd04443f546d88cdf89ec61096cf6..27d0c3c5699cb14ea5353ce9474a5af31d531a27 100644 --- a/packages/api/src/server/user-loader.ts +++ b/packages/api/src/server/user-loader.ts @@ -3,7 +3,7 @@ import { Request as JWTRequest } from 'express-jwt' import { emailsSend, emailsWithTemplateSend } from '../tools/api-mailjet/emails' import { getCurrent } from 'camino-common/src/date' import { EmailTemplateId } from '../tools/api-mailjet/types' -import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools' import { config } from '../config/index' import { Pool } from 'pg' import { createUtilisateur, getUtilisateurById, getUtilisateurByKeycloakId, updateUtilisateur } from '../database/queries/utilisateurs.queries' @@ -29,7 +29,7 @@ export const userLoader = try { const reqUser: JWTUser | undefined = req.auth as JWTUser if (isNotNullNorUndefined(reqUser) && isNotNullNorUndefinedNorEmpty(reqUser.sub)) { - let user: DeepReadonly<User> = await getUtilisateurByKeycloakId(pool, reqUser.sub) + let user: User = await getUtilisateurByKeycloakId(pool, reqUser.sub) if (isNullOrUndefined(user)) { if (isNullOrUndefined(reqUser.family_name) || isNullOrUndefined(reqUser.given_name)) { next(new Error('utilisateur inconnu')) diff --git a/packages/api/src/types.ts b/packages/api/src/types.ts index b570fc352b988ff0f354f5b505c71d10b6e27512..5c04f0a11eeeb847f527af9fe5074572c7b116cc 100644 --- a/packages/api/src/types.ts +++ b/packages/api/src/types.ts @@ -12,7 +12,7 @@ import { TitreReference } from 'camino-common/src/titres-references' import { SecteursMaritimes } from 'camino-common/src/static/facades' import { CaminoDate } from 'camino-common/src/date' import { EntrepriseDocumentId, EntrepriseId } from 'camino-common/src/entreprise' -import { DeepReadonly, RecordPartial } from 'camino-common/src/typescript-tools' +import { RecordPartial } from 'camino-common/src/typescript-tools' import { SDOMZoneId } from 'camino-common/src/static/sdom' import { ActivitesStatutId } from 'camino-common/src/static/activitesStatuts' import { DemarcheId, DemarcheSlug } from 'camino-common/src/demarche' @@ -170,9 +170,9 @@ export interface ITitre { administrationsLocales?: AdministrationId[] | null administrations?: AdministrationId[] | null surface?: number | null - communes?: DeepReadonly<ICommune[]> | null - forets?: DeepReadonly<ForetId[]> | null - sdomZones?: DeepReadonly<SDOMZoneId[]> | null + communes?: ICommune[] | null + forets?: ForetId[] | null + sdomZones?: SDOMZoneId[] | null pointsEtape?: ITitreEtape | null secteursMaritime?: SecteursMaritimes[] | null demarches?: ITitreDemarche[] @@ -199,7 +199,7 @@ export interface ITitreActivite { utilisateurId?: string | null dateSaisie?: CaminoDate contenu?: IContenu | null - sections: DeepReadonly<Section[]> + sections: Section[] suppression?: boolean } @@ -250,9 +250,9 @@ export type ITitreEtape = { administrationsLocales?: AdministrationId[] | null entrepriseDocumentIds?: EntrepriseDocumentId[] | null etapeDocuments?: unknown[] - communes?: DeepReadonly<ICommune[]> | null - forets?: DeepReadonly<ForetId[]> | null - sdomZones?: DeepReadonly<SDOMZoneId[]> | null + communes?: ICommune[] | null + forets?: ForetId[] | null + sdomZones?: SDOMZoneId[] | null secteursMaritime?: SecteursMaritimes[] | null heritageProps?: IHeritageProps | null heritageContenu?: IHeritageContenu | null diff --git a/packages/api/tests/_utils/index.ts b/packages/api/tests/_utils/index.ts index 4f4946a8646201bb896282536770e453037e8266..3a1fbe83ce1a25d834409f71c785d0b0776a4445 100644 --- a/packages/api/tests/_utils/index.ts +++ b/packages/api/tests/_utils/index.ts @@ -25,7 +25,7 @@ import { import { z } from 'zod' import { newUtilisateurId } from '../../src/database/models/_format/id-create' import { idUserKeycloakRecognised } from '../keycloak' -import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools' import { config } from '../../src/config/index' import { createUtilisateur, getUtilisateurById } from '../../src/database/queries/utilisateurs.queries' @@ -87,7 +87,7 @@ export const restPostCall = async <Route extends PostRestRoutes>( caminoRestRoute: Route, params: CaminoRestParams<Route>, user: TestUser | undefined, - body: DeepReadonly<z.infer<(typeof CaminoRestRoutes)[Route]['post']['input']>> + body: z.infer<(typeof CaminoRestRoutes)[Route]['post']['input']> ): Promise<request.Test> => { const req = request(app(pool)).post(getRestRoute(caminoRestRoute, params)).send(body) @@ -98,7 +98,7 @@ export const restNewPostCall = async <Route extends NewPostRestRoutes>( caminoRestRoute: Route, params: CaminoRestParams<Route>, user: TestUser | undefined, - body: DeepReadonly<z.infer<(typeof CaminoRestRoutes)[Route]['newPost']['input']>> + body: z.infer<(typeof CaminoRestRoutes)[Route]['newPost']['input']> ): Promise<request.Test> => { const req = request(app(pool)).post(getRestRoute(caminoRestRoute, params)).send(body) @@ -110,7 +110,7 @@ export const restNewPutCall = async <Route extends NewPutRestRoutes>( path: Route, params: CaminoRestParams<Route>, user: TestUser | undefined, - body: DeepReadonly<z.infer<(typeof CaminoRestRoutes)[Route]['newPut']['input']>> + body: z.infer<(typeof CaminoRestRoutes)[Route]['newPut']['input']> ): Promise<request.Test> => { const req = request(app(pool)).put(getRestRoute(path, params)).send(body) diff --git a/packages/common/src/demarche.ts b/packages/common/src/demarche.ts index 1062de06966912edac19198a3b40f6d35e465331..05dc717b6cb400ef221acc039f500b30f9112004 100644 --- a/packages/common/src/demarche.ts +++ b/packages/common/src/demarche.ts @@ -18,7 +18,7 @@ import { capitalize } from './strings' import { foretIdValidator } from './static/forets' import { featureCollectionForagesValidator, featureCollectionPointsValidator, featureMultiPolygonValidator } from './perimetre' import { geoSystemeIdValidator } from './static/geoSystemes' -import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefinedOrEmpty, toSorted } from './typescript-tools' +import { isNotNullNorUndefined, isNullOrUndefinedOrEmpty, NonEmptyArray, toSorted } from './typescript-tools' import { proprietesGeothermieForagesElementIds } from './static/titresTypes_demarchesTypes_etapesTypes/sections' import { titreIdValidator, titreSlugValidator } from './validators/titres' import { DEMARCHES_TYPES_IDS, DemarcheTypeId, demarcheTypeIdValidator } from './static/demarchesTypes' @@ -280,7 +280,11 @@ export type DemarcheCreationOutput = z.infer<typeof demarcheCreationOutputValida // TODO 2024-12-02 quand on a viré le DeepReadonly, on peut re-essayer d'avoir un typage plus concret, avec : si on a un tableau non vide, alors on a forcément un FirstEtapeDate // T extends [any, ...any[]] ? FirstEtapeDate : FirstEtapeDate | null -export const demarcheEnregistrementDemandeDateFind = (titreEtapes: DeepReadonly<{ date: CaminoDate; typeId: EtapeTypeId }[]> | undefined): null | FirstEtapeDate => { +type DemarcheEnregistrementDemandeDateFindEtape = { date: CaminoDate; typeId: EtapeTypeId } +export function demarcheEnregistrementDemandeDateFind<T extends DemarcheEnregistrementDemandeDateFindEtape[] | NonEmptyArray<DemarcheEnregistrementDemandeDateFindEtape>>( + titreEtapes: T | undefined +): T extends [DemarcheEnregistrementDemandeDateFindEtape, ...DemarcheEnregistrementDemandeDateFindEtape[]] ? FirstEtapeDate : FirstEtapeDate | null +export function demarcheEnregistrementDemandeDateFind(titreEtapes: DemarcheEnregistrementDemandeDateFindEtape[] | undefined): null | FirstEtapeDate { if (isNullOrUndefinedOrEmpty(titreEtapes)) { return null } diff --git a/packages/common/src/etape.ts b/packages/common/src/etape.ts index f325858917afbaa8dc10bb594bd228ea02769339..4459ed007326f38f29637f658edaa55820935560 100644 --- a/packages/common/src/etape.ts +++ b/packages/common/src/etape.ts @@ -7,7 +7,6 @@ import { z } from 'zod' import { tempDocumentNameValidator } from './document' import { autreAvisTypeIdValidator, avisStatutIdValidator, avisTypeIdSansAutreValidator, avisVisibilityIdValidator } from './static/avisTypes' import { FlattenEtape, GraphqlEtape } from './etape-form' -import { DeepReadonly } from './typescript-tools' import { sectionDureeIds } from './static/titresTypes_demarchesTypes_etapesTypes/sections' export const etapeBrouillonValidator = z.boolean().brand('EtapeBrouillon') @@ -130,7 +129,7 @@ export type EtapeDocumentModification = z.infer<typeof etapeDocumentModification export const etapeNoteValidator = z.object({ valeur: z.string(), is_avertissement: z.boolean() }) export type EtapeNote = z.infer<typeof etapeNoteValidator> -export const getStatutId = (etape: Pick<DeepReadonly<FlattenEtape>, 'date' | 'contenu' | 'typeId' | 'statutId'>, currentDate: CaminoDate): EtapeStatutId => { +export const getStatutId = (etape: Pick<FlattenEtape, 'date' | 'contenu' | 'typeId' | 'statutId'>, currentDate: CaminoDate): EtapeStatutId => { if (!isEtapeWithAutomaticStatuts(etape.typeId)) { return etape.statutId } diff --git a/packages/common/src/filters.ts b/packages/common/src/filters.ts index 2ec77019e02597e3644b3946706b440e517ab3c2..c343f74be0e5b51159c31b34f0a6cb897e380d90 100644 --- a/packages/common/src/filters.ts +++ b/packages/common/src/filters.ts @@ -224,7 +224,7 @@ export const caminoFiltres = { name: string placeholder?: string validator: ZodType - elements?: unknown[] + elements?: Readonly<unknown[]> component?: 'FiltresLabel' | 'FiltresTypes' | 'FiltreDomaine' | 'FiltresTitresStatuts' | 'FiltresActivitesStatuts' | 'FiltresDemarchesStatuts' lazy?: boolean } diff --git a/packages/common/src/perimetre.ts b/packages/common/src/perimetre.ts index c6ed2e1cb430bfbea417afe54c34fe971df38032..33eb6931de733e762ebf2aa984d4cd3f1ea74763 100644 --- a/packages/common/src/perimetre.ts +++ b/packages/common/src/perimetre.ts @@ -8,7 +8,7 @@ import { titreSlugValidator } from './validators/titres' import { tempDocumentNameValidator } from './document' import { titreTypeIdValidator } from './static/titresTypes' import { perimetreFileUploadTypeValidator } from './static/documentsTypes' -import { DeepReadonly, isNullOrUndefined } from './typescript-tools' +import { isNullOrUndefined } from './typescript-tools' import { km2Validator } from './number' import { GeoSystemeId, geoSystemeIdValidator } from './static/geoSystemes' @@ -122,7 +122,7 @@ export const geojsonInformationsValidator = z.object({ geojson_origine_geo_systeme_id: geoSystemeIdValidator, }) -export type GeojsonInformations = DeepReadonly<z.infer<typeof geojsonInformationsValidator>> +export type GeojsonInformations = z.infer<typeof geojsonInformationsValidator> export const perimetreInformationsValidator = geojsonInformationsValidator.pick({ superposition_alertes: true, sdomZoneIds: true }).extend({ communes: z.array(communeIdValidator) }) export type PerimetreInformations = z.infer<typeof perimetreInformationsValidator> @@ -146,7 +146,7 @@ export type GeojsonImportForagesBody = z.infer<typeof geojsonImportForagesBodyVa export const geojsonImportForagesResponseValidator = z.object({ geojson4326: featureCollectionForagesValidator, origin: featureCollectionForagesValidator }) export type GeojsonImportForagesResponse = z.infer<typeof geojsonImportForagesResponseValidator> -const internalEqualGeojson = (geo1: DeepReadonly<MultiPolygon>, geo2: DeepReadonly<MultiPolygon>): boolean => { +const internalEqualGeojson = (geo1: MultiPolygon, geo2: MultiPolygon): boolean => { return geo1.coordinates.every((level1, indexLevel1) => { return level1.every((level2, indexLevel2) => { return level2.every((level3, indexLevel3) => { @@ -156,7 +156,7 @@ const internalEqualGeojson = (geo1: DeepReadonly<MultiPolygon>, geo2: DeepReadon }) } -export const equalGeojson = (geo1: DeepReadonly<MultiPolygon> | null, geo2: DeepReadonly<MultiPolygon> | null | undefined): boolean => { +export const equalGeojson = (geo1: MultiPolygon | null, geo2: MultiPolygon | null | undefined): boolean => { if (isNullOrUndefined(geo1) && isNullOrUndefined(geo2)) { return true } diff --git a/packages/common/src/permissions/administrations.ts b/packages/common/src/permissions/administrations.ts index 8712566091967eea25227c4407d5539691af693a..87a7cdcb6586ec21e7851f754b47bcbcffe605bd 100644 --- a/packages/common/src/permissions/administrations.ts +++ b/packages/common/src/permissions/administrations.ts @@ -1,7 +1,6 @@ import { isAdministration, isAdministrationAdmin, isAdministrationEditeur, isSuper, User } from '../roles' import { AdministrationId, Administrations, sortedAdministrations } from '../static/administrations' import { Departements } from '../static/departement' -import { DeepReadonly } from '../typescript-tools' export const canReadActivitesTypesEmails = (user: User, administrationId: AdministrationId): boolean => { if (!canReadAdministrations(user)) { @@ -34,7 +33,7 @@ export const canReadActivitesTypesEmails = (user: User, administrationId: Admini return false } -export const canReadAdministrations = (user: DeepReadonly<User>): boolean => isSuper(user) || isAdministration(user) +export const canReadAdministrations = (user: User): boolean => isSuper(user) || isAdministration(user) export const canEditEmails = (user: User, administrationId: AdministrationId): boolean => { if (isSuper(user) || ((isAdministrationAdmin(user) || isAdministrationEditeur(user)) && Administrations[user.administrationId].typeId === 'min')) { diff --git a/packages/common/src/permissions/entreprises.ts b/packages/common/src/permissions/entreprises.ts index acf99b28914bfc2db66acd9c79f8c0963089875a..bcf46c2124cd7eaf0af5284dcd436fc689525534 100644 --- a/packages/common/src/permissions/entreprises.ts +++ b/packages/common/src/permissions/entreprises.ts @@ -1,6 +1,5 @@ import { EntrepriseId } from '../entreprise' import { isAdministrationAdmin, isAdministrationEditeur, isBureauDEtudes, isEntreprise, User, isSuper, isAdministration } from '../roles' -import { DeepReadonly } from '../typescript-tools' export const canCreateEntreprise = (user: User): boolean => { if (isSuper(user) || isAdministrationAdmin(user) || isAdministrationEditeur(user)) { @@ -10,7 +9,7 @@ export const canCreateEntreprise = (user: User): boolean => { return false } -export const canEditEntreprise = (user: DeepReadonly<User>, entrepriseId?: EntrepriseId): boolean => { +export const canEditEntreprise = (user: User, entrepriseId?: EntrepriseId): boolean => { if (isSuper(user) || isAdministrationAdmin(user) || isAdministrationEditeur(user)) { return true } @@ -22,7 +21,7 @@ export const canEditEntreprise = (user: DeepReadonly<User>, entrepriseId?: Entre return false } -export const canSeeEntrepriseDocuments = (user: DeepReadonly<User>, entrepriseId: EntrepriseId): boolean => { +export const canSeeEntrepriseDocuments = (user: User, entrepriseId: EntrepriseId): boolean => { if (isSuper(user) || isAdministration(user)) { return true } diff --git a/packages/common/src/permissions/etape-form.test.ts b/packages/common/src/permissions/etape-form.test.ts index 50aa5c422a6573f737b5cc99f04d64e3fc486147..4e107edad025a35180877f13e8684a3252bec8fe 100644 --- a/packages/common/src/permissions/etape-form.test.ts +++ b/packages/common/src/permissions/etape-form.test.ts @@ -16,7 +16,7 @@ import { sectionsStepIsComplete, sectionsStepIsVisible, } from './etape-form' -import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON, etapeDocumentIdValidator } from '../etape' +import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON, EtapeDocument, TempEtapeDocument } from '../etape' import { firstEtapeDateValidator, toCaminoDate } from '../date' import { testBlankUser } from '../tests-utils' import { entrepriseIdValidator } from '../entreprise' @@ -520,69 +520,36 @@ test('etapeDocumentsStepIsVisible', () => { expect(etapeDocumentsStepIsVisible()).toBe(true) }) -const axmDocumentsComplete = [ +const axmDocumentsComplete: Pick<EtapeDocument | TempEtapeDocument, 'etape_document_type_id'>[] = [ { - description: "Plan à l'échelle 1/50 000ème ou 1/100 000ème", - id: etapeDocumentIdValidator.parse('idcar'), etape_document_type_id: 'car', - entreprises_lecture: true, - public_lecture: true, }, { - description: null, - id: etapeDocumentIdValidator.parse('idlem'), etape_document_type_id: 'lem', - entreprises_lecture: true, - public_lecture: true, }, { - description: '', - id: etapeDocumentIdValidator.parse('ididm'), etape_document_type_id: 'idm', - entreprises_lecture: true, - public_lecture: true, }, { - description: - 'la définition des mesures prévues par le pétitionnaire pour réhabiliter le site après exploitation, notamment la nature et les modalités de revégétalisation envisagée. (décret 2001-204, art. 5 bis)', - id: etapeDocumentIdValidator.parse('idmes'), etape_document_type_id: 'mes', - entreprises_lecture: true, - public_lecture: true, }, { - description: "descriptif des méthodes envisagées pour l'exécution des travaux ((décret 2001-204, art. 6)", - id: etapeDocumentIdValidator.parse('idmet'), etape_document_type_id: 'met', - entreprises_lecture: true, - public_lecture: true, }, { - description: null, - id: etapeDocumentIdValidator.parse('idnip'), etape_document_type_id: 'nip', - entreprises_lecture: true, - public_lecture: true, }, { - description: 'Description du phasage et planigramme des travaux. (décret 2001-204, art. 5)', - id: etapeDocumentIdValidator.parse('idprg'), etape_document_type_id: 'prg', - entreprises_lecture: true, - public_lecture: true, }, { - description: "le schéma de pénétration du massif forestier proposé par le pétitionnaire pour l'acheminement du matériel lourd et la desserte du chantier (décret 2001-204, art. 5 bis)", - id: etapeDocumentIdValidator.parse('idsch'), etape_document_type_id: 'sch', - entreprises_lecture: true, - public_lecture: true, }, -] as const +] const entreprise1Id = entrepriseIdValidator.parse('id1') test('etapeDocumentsStepIsComplete', () => { diff --git a/packages/common/src/permissions/etape-form.ts b/packages/common/src/permissions/etape-form.ts index 0278c7825053dafb5bd2ac2924ba8fb9c37ae47e..1842ded65fd46c36c0c0c2243102f6c57b17a0ff 100644 --- a/packages/common/src/permissions/etape-form.ts +++ b/packages/common/src/permissions/etape-form.ts @@ -15,7 +15,7 @@ import { getDocuments } from '../static/titresTypes_demarchesTypes_etapesTypes/d import { getEntrepriseDocuments } from '../static/titresTypes_demarchesTypes_etapesTypes/entrepriseDocuments' import { documentTypeIdsBySdomZonesGet } from '../static/titresTypes_demarchesTypes_etapesTypes/sdom' import { getSections, getSectionsWithValue } from '../static/titresTypes_demarchesTypes_etapesTypes/sections' -import { isNotNullNorUndefinedNorEmpty, DeepReadonly, onlyUnique, NonEmptyArray, isNonEmptyArray, isNullOrUndefinedOrEmpty, isNullOrUndefined, Nullable } from '../typescript-tools' +import { isNotNullNorUndefinedNorEmpty, onlyUnique, NonEmptyArray, isNonEmptyArray, isNullOrUndefinedOrEmpty, isNullOrUndefined, Nullable } from '../typescript-tools' import { sectionsWithValueCompleteValidate } from './sections' import { canEditAmodiataires, canEditDuree, canEditPerimetre, canEditTitulaires } from './titres-etapes' import { machineIdFind } from '../machines' @@ -24,10 +24,10 @@ import { FirstEtapeDate } from '../date' type ValidReturn = { valid: true } | { valid: false; errors: NonEmptyArray<string> } -export const dateTypeStepIsVisible = (user: DeepReadonly<User>): boolean => { +export const dateTypeStepIsVisible = (user: User): boolean => { return isSuper(user) || isAdministrationAdmin(user) || isAdministrationEditeur(user) } -export const dateTypeStepIsComplete = (etape: DeepReadonly<Nullable<Pick<FlattenEtape, 'typeId' | 'date' | 'statutId'>>>, user: DeepReadonly<User>): ValidReturn => { +export const dateTypeStepIsComplete = (etape: Nullable<Pick<FlattenEtape, 'typeId' | 'date' | 'statutId'>>, user: User): ValidReturn => { if (!dateTypeStepIsVisible(user)) { return { valid: true } } @@ -57,10 +57,10 @@ export const fondamentaleStepIsVisible = (etapeTypeId: EtapeTypeId): boolean => } export const fondamentaleStepIsComplete = ( - flattened: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'duree' | 'substances' | 'titulaires' | 'amodiataires'>>, + flattened: Pick<FlattenEtape, 'typeId' | 'duree' | 'substances' | 'titulaires' | 'amodiataires'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId, - user: DeepReadonly<User> + user: User ): ValidReturn => { if (!fondamentaleStepIsVisible(flattened.typeId)) { return { valid: true } @@ -96,7 +96,7 @@ export const fondamentaleStepIsComplete = ( export const sectionsStepIsVisible = (etape: Pick<FlattenEtape, 'typeId'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => { return getSections(titreTypeId, demarcheTypeId, etape.typeId).length > 0 } -export const sectionsStepIsComplete = (etape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'contenu'>>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): ValidReturn => { +export const sectionsStepIsComplete = (etape: Pick<FlattenEtape, 'typeId' | 'contenu'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): ValidReturn => { if (!sectionsStepIsVisible(etape, demarcheTypeId, titreTypeId)) { return { valid: true } } @@ -117,7 +117,7 @@ export const perimetreStepIsVisible = (etape: Pick<FlattenEtape, 'typeId'>, dema return editPerimetre.visibility === 'present' } -export const perimetreStepIsComplete = (etape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'perimetre'>>, demarcheTypeId: DemarcheTypeId): ValidReturn => { +export const perimetreStepIsComplete = (etape: Pick<FlattenEtape, 'typeId' | 'perimetre'>, demarcheTypeId: DemarcheTypeId): ValidReturn => { if (!perimetreStepIsVisible(etape, demarcheTypeId)) { return { valid: true } } @@ -136,11 +136,11 @@ export const perimetreStepIsComplete = (etape: DeepReadonly<Pick<FlattenEtape, ' } export const getDocumentsTypes = ( - etape: DeepReadonly<Pick<FlattenEtape, 'typeId'>>, + etape: Pick<FlattenEtape, 'typeId'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId, demarcheId: DemarcheId, - sdomZoneIds: DeepReadonly<SDOMZoneId[]>, + sdomZoneIds: SDOMZoneId[], isArmMecanise: boolean, firstEtapeDate: FirstEtapeDate ): (DocumentType | AutreDocumentType)[] => { @@ -186,7 +186,7 @@ export const getAvisTypes = ( demarcheTypeId: DemarcheTypeId, demarcheId: DemarcheId, firstEtapeDate: FirstEtapeDate, - communeIds: DeepReadonly<CommuneId[]> + communeIds: CommuneId[] ): { id: AvisTypeId; optionnel: boolean }[] => { const avis: { id: AvisTypeId; optionnel: boolean }[] = [] if (etapeTypeId === ETAPES_TYPES.demande && titreTypeId === TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX) { @@ -245,12 +245,12 @@ export const etapeDocumentsStepIsVisible = (): boolean => { } export const etapeDocumentsStepIsComplete = ( - etape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'contenu' | 'isBrouillon'>>, + etape: Pick<FlattenEtape, 'typeId' | 'contenu' | 'isBrouillon'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId, demarcheId: DemarcheId, - etapeDocuments: DeepReadonly<Pick<EtapeDocument | TempEtapeDocument, 'etape_document_type_id'>[]>, - sdomZoneIds: DeepReadonly<SDOMZoneId[]>, + etapeDocuments: Pick<EtapeDocument | TempEtapeDocument, 'etape_document_type_id'>[], + sdomZoneIds: SDOMZoneId[], firstEtapeDate: FirstEtapeDate ): ValidReturn => { const errors: string[] = [] @@ -275,19 +275,19 @@ export const etapeAvisStepIsVisible = ( demarcheTypeId: DemarcheTypeId, demarcheId: DemarcheId, firstEtapeDate: FirstEtapeDate, - communeIds: DeepReadonly<CommuneId[]> + communeIds: CommuneId[] ): boolean => { return getAvisTypes(etape.typeId, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds).length > 0 } export const etapeAvisStepIsComplete = ( - etape: DeepReadonly<Pick<FlattenEtape, 'typeId'>>, - etapeAvis: DeepReadonly<Pick<EtapeAvis | TempEtapeAvis, 'avis_type_id'>[]>, + etape: Pick<FlattenEtape, 'typeId'>, + etapeAvis: Pick<EtapeAvis | TempEtapeAvis, 'avis_type_id'>[], titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, demarcheId: DemarcheId, firstEtapeDate: FirstEtapeDate, - communeIds: DeepReadonly<CommuneId[]> + communeIds: CommuneId[] ): ValidReturn => { if (!etapeAvisStepIsVisible(etape, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds)) { return { valid: true } @@ -305,10 +305,10 @@ export const entrepriseDocumentsStepIsVisible = (etape: Pick<FlattenEtape, 'type return getEntrepriseDocuments(titreTypeId, demarcheTypeId, etape.typeId).length > 0 } export const entrepriseDocumentsStepIsComplete = ( - etape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'contenu' | 'titulaires' | 'amodiataires'>>, + etape: Pick<FlattenEtape, 'typeId' | 'contenu' | 'titulaires' | 'amodiataires'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId, - entreprisesDocuments: DeepReadonly<Pick<SelectedEntrepriseDocument, 'documentTypeId' | 'entrepriseId'>[]> + entreprisesDocuments: Pick<SelectedEntrepriseDocument, 'documentTypeId' | 'entrepriseId'>[] ): ValidReturn => { if (!entrepriseDocumentsStepIsVisible(etape, demarcheTypeId, titreTypeId)) { return { valid: true } diff --git a/packages/common/src/permissions/sections.ts b/packages/common/src/permissions/sections.ts index 37af99f69b81e4fc03c107ab8e8e9cffe511960e..e609a5c6dd6697d975b7ab42e72cd2fe89955349 100644 --- a/packages/common/src/permissions/sections.ts +++ b/packages/common/src/permissions/sections.ts @@ -1,10 +1,10 @@ import { ElementWithValue } from '../sections' -import { DeepReadonly, isNullOrUndefined } from '../typescript-tools' +import { isNullOrUndefined } from '../typescript-tools' // @deprecated ==> type better export type Contenu = { [key in string]?: { [secondKey in string]?: unknown } } | null -export const sectionsWithValueCompleteValidate = (sections_with_value: DeepReadonly<{ nom?: string; elements: Pick<ElementWithValue, 'nom' | 'optionnel' | 'value' | 'type'>[] }[]>): string[] => { +export const sectionsWithValueCompleteValidate = (sections_with_value: { nom?: string; elements: Pick<ElementWithValue, 'nom' | 'optionnel' | 'value' | 'type'>[] }[]): string[] => { const errors: string[] = [] sections_with_value.forEach(s => s.elements.forEach(e => { @@ -17,7 +17,7 @@ export const sectionsWithValueCompleteValidate = (sections_with_value: DeepReado return errors } -export const sectionElementWithValueCompleteValidate = (elementWithValue: DeepReadonly<Pick<ElementWithValue, 'optionnel' | 'value' | 'type'>>): boolean => { +export const sectionElementWithValueCompleteValidate = (elementWithValue: Pick<ElementWithValue, 'optionnel' | 'value' | 'type'>): boolean => { if ((isNullOrUndefined(elementWithValue.optionnel) || !elementWithValue.optionnel) && !['checkbox'].includes(elementWithValue.type)) { if (isNullOrUndefined(elementWithValue.value) || elementWithValue.value === '') { return false diff --git a/packages/common/src/permissions/titres-demarches.ts b/packages/common/src/permissions/titres-demarches.ts index 8b7eda2e60d60df865bbbf7aa62567b7ae887241..34ae82575c08d03da4c9a4cb7cf301c8223d0407 100644 --- a/packages/common/src/permissions/titres-demarches.ts +++ b/packages/common/src/permissions/titres-demarches.ts @@ -8,7 +8,7 @@ import { getEtapesTDE } from '../static/titresTypes_demarchesTypes_etapesTypes/i import { DemarcheTypeId } from '../static/demarchesTypes' import { canCreateEtape } from './titres-etapes' import { TitreGetDemarche } from '../titres' -import { DeepReadonly, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from '../typescript-tools' +import { isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from '../typescript-tools' import { ETAPE_IS_BROUILLON } from '../etape' import { demarcheEnregistrementDemandeDateFind, DemarcheEtape, DemarcheId } from '../demarche' import { machineIdFind } from '../machines' @@ -20,7 +20,7 @@ const hasOneDemarcheWithoutPhase = (demarches: Pick<TitreGetDemarche, 'demarche_ return isNotNullNorUndefinedNorEmpty(demarches) && demarches.length === 1 && isNullOrUndefined(demarches[0].demarche_date_debut) } export const canCreateDemarche = ( - user: DeepReadonly<User>, + user: User, titreTypeId: TitreTypeId, titreStatutId: TitreStatutId, administrationsLocales: AdministrationId[], @@ -29,7 +29,7 @@ export const canCreateDemarche = ( return !hasOneDemarcheWithoutPhase(demarches) && canEditDemarche(user, titreTypeId, titreStatutId, administrationsLocales) } -export const canEditDemarche = (user: DeepReadonly<User>, titreTypeId: TitreTypeId, titreStatutId: TitreStatutId, administrationsLocales: AdministrationId[]): boolean => { +export const canEditDemarche = (user: User, titreTypeId: TitreTypeId, titreStatutId: TitreStatutId, administrationsLocales: AdministrationId[]): boolean => { if (isSuper(user)) { return true } else if (isAdministrationAdmin(user) || isAdministrationEditeur(user)) { @@ -57,7 +57,7 @@ export const canDeleteDemarche = (user: User, titreTypeId: TitreTypeId, titreSta return false } -export const canCreateTravaux = (user: DeepReadonly<User>, titreTypeId: TitreTypeId, administrations: AdministrationId[], demarches: Pick<TitreGetDemarche, 'demarche_date_debut'>[]): boolean => { +export const canCreateTravaux = (user: User, titreTypeId: TitreTypeId, administrations: AdministrationId[], demarches: Pick<TitreGetDemarche, 'demarche_date_debut'>[]): boolean => { if (hasOneDemarcheWithoutPhase(demarches)) { return false } @@ -89,7 +89,7 @@ export const canCreateEtapeByDemarche = ( } export const canPublishResultatMiseEnConcurrence = ( - user: DeepReadonly<User>, + user: User, titre_type_id: TitreTypeId, demarche_type_id: DemarcheTypeId, etapes: Pick<DemarcheEtape, 'etape_type_id' | 'demarche_id_en_concurrence' | 'date' | 'etape_statut_id'>[], diff --git a/packages/common/src/permissions/titres-etapes.ts b/packages/common/src/permissions/titres-etapes.ts index 324efe9e6b3d18ad81005834d8e433f95f648ecc..5db02835a6b752760261e96b35c2a589c3e8b4f0 100644 --- a/packages/common/src/permissions/titres-etapes.ts +++ b/packages/common/src/permissions/titres-etapes.ts @@ -6,7 +6,7 @@ import { canAdministrationEtapeTypeId } from '../static/administrationsTitresTyp import { TitreStatutId } from '../static/titresStatuts' import { EntrepriseDocument, EntrepriseId } from '../entreprise' import { SDOMZoneId } from '../static/sdom' -import { DeepReadonly, NonEmptyArray, isNonEmptyArray } from '../typescript-tools' +import { NonEmptyArray, isNonEmptyArray } from '../typescript-tools' import { ETAPE_IS_BROUILLON, EtapeAvis, EtapeBrouillon, EtapeDocument, TempEtapeAvis, TempEtapeDocument } from '../etape' import { dateTypeStepIsComplete, @@ -34,7 +34,7 @@ type InputPresentRequired = { visibility: 'present'; required: true; message: st export type InputPresentOptional = { visibility: 'present'; required: false } export type InputPresence = InputAbsent | InputPresentRequired | InputPresentOptional -export const canEditAmodiataires = (titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, user: DeepReadonly<User>): InputPresence => { +export const canEditAmodiataires = (titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, user: User): InputPresence => { if (titreTypeId === TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX || titreTypeId === TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX) { return { visibility: 'absent', message: `une autorisation ${titreTypeId === 'arm' ? 'de recherche' : "d'exploitation"} ne peut pas inclure d'amodiataires` } } @@ -69,7 +69,7 @@ export const canEditAmodiataires = (titreTypeId: TitreTypeId, demarcheTypeId: De const demarchesSansDatesNiDureePourLesEtapes = [DEMARCHES_TYPES_IDS.DeplacementDePerimetre, DEMARCHES_TYPES_IDS.Mutation, DEMARCHES_TYPES_IDS.ExtensionDePerimetre] as const // Attention les champs dates ne sont jamais obligatoires, si ils le deviennent il faudra faire des modifs dans la validation et dans l'ui -export const canEditDates = (_titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, etapeTypeId: EtapeTypeId, user: DeepReadonly<User>): InputAbsent | InputPresentOptional => { +export const canEditDates = (_titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, etapeTypeId: EtapeTypeId, user: User): InputAbsent | InputPresentOptional => { if (demarchesSansDatesNiDureePourLesEtapes.includes(demarcheTypeId)) { return { visibility: 'absent', message: `une démarche ${DemarchesTypes[demarcheTypeId].nom} ne peut pas inclure de date` } } @@ -85,7 +85,7 @@ export const canEditDates = (_titreTypeId: TitreTypeId, demarcheTypeId: Demarche return { visibility: 'absent', message: 'droits insuffisants pour éditer les dates' } } -export const canEditTitulaires = (_titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, user: DeepReadonly<User>): InputPresence => { +export const canEditTitulaires = (_titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, user: User): InputPresence => { if ( [ DEMARCHES_TYPES_IDS.Fusion, @@ -146,7 +146,7 @@ export const dureeIsValide = ( return { valid: true } } -export const canEditDuree = (_titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, _user: DeepReadonly<User>): InputPresence => { +export const canEditDuree = (_titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, _user: User): InputPresence => { // par exemple, ne peut pas ajouter de durée à la démarche déplacement de périmètre if (demarchesSansDatesNiDureePourLesEtapes.includes(demarcheTypeId)) { return { visibility: 'absent', message: `une démarche ${DemarchesTypes[demarcheTypeId].nom} ne peut pas inclure de durée` } @@ -210,7 +210,7 @@ export const canEditPerimetre = (demarcheTypeId: DemarcheTypeId, etapeTypeId: Et } export const canCreateEtape = ( - user: DeepReadonly<User>, + user: User, etapeTypeId: EtapeTypeId, isBrouillon: EtapeBrouillon, titulaireIds: EntrepriseId[], @@ -236,7 +236,7 @@ export const canDeleteEtape = ( } export const canEditEtape = ( - user: DeepReadonly<User>, + user: User, etapeTypeId: EtapeTypeId, isBrouillon: EtapeBrouillon, titulaireIds: EntrepriseId[], @@ -248,7 +248,7 @@ export const canEditEtape = ( } const canCreateOrEditEtape = ( - user: DeepReadonly<User>, + user: User, etapeTypeId: EtapeTypeId, isBrouillon: EtapeBrouillon, titulaireIds: EntrepriseId[], @@ -276,12 +276,12 @@ const canCreateOrEditEtape = ( return false } -export type IsEtapeCompleteEtape = DeepReadonly<Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'>> -export type IsEtapeCompleteDocuments = DeepReadonly<Pick<EtapeDocument | TempEtapeDocument, 'etape_document_type_id'>[]> -export type IsEtapeCompleteEntrepriseDocuments = DeepReadonly<Pick<EntrepriseDocument, 'entreprise_document_type_id' | 'entreprise_id'>[]> -type IsEtapeCompleteSdomZones = DeepReadonly<SDOMZoneId[]> | null | undefined -type IsEtapeCompleteCommunes = DeepReadonly<CommuneId[]> -export type IsEtapeCompleteEtapeAvis = DeepReadonly<Pick<EtapeAvis, 'avis_type_id'>[]> +export type IsEtapeCompleteEtape = Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'> +export type IsEtapeCompleteDocuments = Pick<EtapeDocument | TempEtapeDocument, 'etape_document_type_id'>[] +export type IsEtapeCompleteEntrepriseDocuments = Pick<EntrepriseDocument, 'entreprise_document_type_id' | 'entreprise_id'>[] +type IsEtapeCompleteSdomZones = SDOMZoneId[] | null | undefined +type IsEtapeCompleteCommunes = CommuneId[] +export type IsEtapeCompleteEtapeAvis = Pick<EtapeAvis, 'avis_type_id'>[] export const isEtapeValid = ( etape: IsEtapeCompleteEtape, @@ -320,7 +320,7 @@ export const isEtapeComplete = ( sdomZones: IsEtapeCompleteSdomZones, communes: IsEtapeCompleteCommunes, etapeAvis: IsEtapeCompleteEtapeAvis, - user: DeepReadonly<User>, + user: User, firstEtapeDate: FirstEtapeDate ): { valid: true } | { valid: false; errors: NonEmptyArray<string> } => { const isCompleteChecks = [ @@ -352,13 +352,13 @@ export const isEtapeComplete = ( return { valid: true } } -type IsEtapeDeposableEtapeAvis = DeepReadonly<Pick<EtapeAvis | TempEtapeAvis, 'avis_type_id'>[]> +type IsEtapeDeposableEtapeAvis = Pick<EtapeAvis | TempEtapeAvis, 'avis_type_id'>[] export const isEtapeDeposable = ( user: User, titreTypeId: TitreTypeId, demarcheId: DemarcheId, demarcheTypeId: DemarcheTypeId, - titreEtape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'>>, + titreEtape: Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'>, etapeDocuments: IsEtapeCompleteDocuments, entrepriseDocuments: IsEtapeCompleteEntrepriseDocuments, sdomZones: IsEtapeCompleteSdomZones, @@ -390,7 +390,7 @@ export const canDeposeEtape = ( }, demarcheId: DemarcheId, demarcheTypeId: DemarcheTypeId, - titreEtape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'>>, + titreEtape: Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'>, etapeDocuments: Pick<EtapeDocument, 'etape_document_type_id'>[], entrepriseDocuments: Pick<EntrepriseDocument, 'entreprise_document_type_id' | 'entreprise_id'>[], sdomZones: SDOMZoneId[] | null | undefined, diff --git a/packages/common/src/permissions/titres.ts b/packages/common/src/permissions/titres.ts index 2ced9a92077074b6c454800f8028daa84556782f..fbf7a9368df304e53161dfd81ffe1dee1bb1e388 100644 --- a/packages/common/src/permissions/titres.ts +++ b/packages/common/src/permissions/titres.ts @@ -10,7 +10,7 @@ import { activitesTypesPays } from '../static/activitesTypesPays' import { canAdministrationModifyTitres } from '../static/administrationsTitresTypesTitresStatuts' import { TitreStatutId } from '../static/titresStatuts' import { territoiresIdFind } from '../territoires' -import { DeepReadonly, isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty, SimplePromiseFn } from '../typescript-tools' +import { isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty, SimplePromiseFn } from '../typescript-tools' import { SecteursMaritimes } from '../static/facades' import { EntrepriseId } from '../entreprise' import { TITRES_TYPES_TYPES_IDS } from '../static/titresTypesTypes' @@ -37,7 +37,7 @@ export const getLinkConfig = (typeId: TitreTypeId, demarches: { demarche_type_id return null } -export const canLinkTitres = (user: DeepReadonly<User>, administrationIds: AdministrationId[]): boolean => { +export const canLinkTitres = (user: User, administrationIds: AdministrationId[]): boolean => { if (isSuper(user)) { return true } @@ -51,7 +51,7 @@ export const canLinkTitres = (user: DeepReadonly<User>, administrationIds: Admin export const TITRES_TYPES_IDS_DEMAT = ['arm', 'axm'] -export const canCreateTitre = (user: DeepReadonly<User>, titreTypeId: TitreTypeId | null): boolean => { +export const canCreateTitre = (user: User, titreTypeId: TitreTypeId | null): boolean => { if (isSuper(user)) { return true } else if (isAdministrationAdmin(user) || isAdministrationEditeur(user)) { @@ -109,7 +109,7 @@ export const canDeleteTitre = (user: User): boolean => isSuper(user) interface TitreReduced { titreTypeId: TitreTypeId - communes: DeepReadonly<{ id: CommuneId }[]> + communes: { id: CommuneId }[] secteursMaritime: SecteursMaritimes[] demarches: unknown[] } diff --git a/packages/common/src/permissions/utilisateurs.ts b/packages/common/src/permissions/utilisateurs.ts index 71e22b1592b2a6ba379831473028c89ecc7f73b5..afdbf458345c36ee79785c694be015822671dc81 100644 --- a/packages/common/src/permissions/utilisateurs.ts +++ b/packages/common/src/permissions/utilisateurs.ts @@ -12,12 +12,12 @@ import { isAdministrationLecteur, isEntrepriseOrBureauDEtude, } from '../roles' -import { DeepReadonly, isNotNullNorUndefinedNorEmpty } from '../typescript-tools' +import { isNotNullNorUndefinedNorEmpty } from '../typescript-tools' export const canCreateEntreprise = (user: User): boolean => isSuper(user) || isAdministrationAdmin(user) || isAdministrationEditeur(user) -export const canReadUtilisateurs = (user: DeepReadonly<User>): boolean => isSuper(user) || isAdministration(user) || isEntreprise(user) || isBureauDEtudes(user) +export const canReadUtilisateurs = (user: User): boolean => isSuper(user) || isAdministration(user) || isEntreprise(user) || isBureauDEtudes(user) -export const canReadUtilisateur = (user: DeepReadonly<User>, utilisateur: UserNotNull): boolean => { +export const canReadUtilisateur = (user: User, utilisateur: UserNotNull): boolean => { if (user?.id === utilisateur.id) { return true } diff --git a/packages/common/src/roles.ts b/packages/common/src/roles.ts index 4a732b3ed04fc6f2121a165ec8331bc8224f3bbd..b98f841456ee4de4e36d3ff8eb4df8ddeef2e804 100644 --- a/packages/common/src/roles.ts +++ b/packages/common/src/roles.ts @@ -1,7 +1,6 @@ import { administrationIdValidator } from './static/administrations' import { entrepriseIdValidator } from './entreprise' import { z } from 'zod' -import { DeepReadonly } from './typescript-tools' export const ROLES = ['super', 'admin', 'editeur', 'lecteur', 'entreprise', "bureau d'études", 'defaut'] as const @@ -57,22 +56,21 @@ export type EntrepriseUserNotNull = z.infer<typeof entrepriseUserNotNullValidato export const userNotNullValidator = z.discriminatedUnion('role', [superUserNotNullValidator, defautUserNotNullValidator, adminUserNotNullValidator, entrepriseUserNotNullValidator]) export const userValidator = userNotNullValidator.nullable().optional() -export const isSuper = (user: DeepReadonly<User>): user is UserSuper => userPermissionCheck(user, 'super') +export const isSuper = (user: User): user is UserSuper => userPermissionCheck(user, 'super') -export const isAdministration = (user: DeepReadonly<User>): user is UserLecteur | UserAdmin | UserEditeur => - isAdministrationAdmin(user) || isAdministrationEditeur(user) || isAdministrationLecteur(user) -export const isAdministrationAdmin = (user: DeepReadonly<User>): user is UserAdmin => userPermissionCheck(user, 'admin') -export const isAdministrationEditeur = (user: DeepReadonly<User>): user is UserEditeur => userPermissionCheck(user, 'editeur') -export const isAdministrationLecteur = (user: DeepReadonly<User>): user is UserLecteur => userPermissionCheck(user, 'lecteur') -export const isEntrepriseOrBureauDEtude = (user: DeepReadonly<User>): user is UserEntreprise | UserBureaudEtudes => isEntreprise(user) || isBureauDEtudes(user) +export const isAdministration = (user: User): user is UserLecteur | UserAdmin | UserEditeur => isAdministrationAdmin(user) || isAdministrationEditeur(user) || isAdministrationLecteur(user) +export const isAdministrationAdmin = (user: User): user is UserAdmin => userPermissionCheck(user, 'admin') +export const isAdministrationEditeur = (user: User): user is UserEditeur => userPermissionCheck(user, 'editeur') +export const isAdministrationLecteur = (user: User): user is UserLecteur => userPermissionCheck(user, 'lecteur') +export const isEntrepriseOrBureauDEtude = (user: User): user is UserEntreprise | UserBureaudEtudes => isEntreprise(user) || isBureauDEtudes(user) -export const isEntreprise = (user: DeepReadonly<User>): user is UserEntreprise => userPermissionCheck(user, 'entreprise') -export const isBureauDEtudes = (user: DeepReadonly<User>): user is UserBureaudEtudes => userPermissionCheck(user, "bureau d'études") -export const isDefault = (user: DeepReadonly<User>): user is UserDefaut | undefined => !user || userPermissionCheck(user, 'defaut') +export const isEntreprise = (user: User): user is UserEntreprise => userPermissionCheck(user, 'entreprise') +export const isBureauDEtudes = (user: User): user is UserBureaudEtudes => userPermissionCheck(user, "bureau d'études") +export const isDefault = (user: User): user is UserDefaut | undefined => !user || userPermissionCheck(user, 'defaut') export const isRole = (role: Role | string | undefined | null): role is Role => ROLES.includes(role) -function userPermissionCheck(user: DeepReadonly<User>, role: Role) { +function userPermissionCheck(user: User, role: Role) { return user?.role === role } diff --git a/packages/common/src/sections.ts b/packages/common/src/sections.ts index 201e066b0dcb24e8f08922d98b58f34dd1fa6baf..4231561877aa56e0de1c1c3fff8f179922d544c9 100644 --- a/packages/common/src/sections.ts +++ b/packages/common/src/sections.ts @@ -12,7 +12,7 @@ import { urlElementValidator, } from './static/titresTypes_demarchesTypes_etapesTypes/sections' import { z } from 'zod' -import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from './typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from './typescript-tools' import { TitreTypeId } from './static/titresTypes' import { DemarcheTypeId } from './static/demarchesTypes' import { EtapeTypeId } from './static/etapesTypes' @@ -51,10 +51,10 @@ const elementWithValueValidator = z.union([ export type ElementWithValue = z.infer<typeof elementWithValueValidator> -export const isNumberElement = (element: DeepReadonly<ElementWithValue>): element is DeepReadonly<NumberElementWithValue> => { +export const isNumberElement = (element: ElementWithValue): element is NumberElementWithValue => { return element.type === 'number' || element.type === 'integer' } -export const isRadioElement = (element: DeepReadonly<ElementWithValue>): element is DeepReadonly<RadioElementWithValue> => { +export const isRadioElement = (element: ElementWithValue): element is RadioElementWithValue => { return element.type === 'radio' } diff --git a/packages/common/src/static/activitesTypes.ts b/packages/common/src/static/activitesTypes.ts index a914120ee3b691d6da534d37225f25bfc9175353..f827c7e3071869a57d1884894b0f6bddc4620a25 100644 --- a/packages/common/src/static/activitesTypes.ts +++ b/packages/common/src/static/activitesTypes.ts @@ -1,7 +1,6 @@ import { CaminoDate, toCaminoDate } from '../date' import { FrequenceId } from './frequence' import { Section, SectionElement } from './titresTypes_demarchesTypes_etapesTypes/sections' -import { DeepReadonly } from '../typescript-tools' import { z } from 'zod' const IDS = ['gra', 'grp', 'grx', 'pma', 'pmb', 'pmc', 'pmd', 'wrp'] as const @@ -28,11 +27,11 @@ export type ActiviteType<T = ActivitesTypesId> = { dateDebut: CaminoDate delaiMois: number description?: string - sections: DeepReadonly<ActiviteSection[]> + sections: ActiviteSection[] } type SubstancesFiscalesSection = { id: 'substancesFiscales'; nom: string } -export const isSubstancesFiscales = (section: DeepReadonly<ActiviteSection>): section is DeepReadonly<SubstancesFiscalesSection> => section.id === 'substancesFiscales' +export const isSubstancesFiscales = (section: ActiviteSection): section is SubstancesFiscalesSection => section.id === 'substancesFiscales' export type ActiviteSection = (Omit<Section, 'elements'> & { elements: ActiviteSectionElement[] }) | SubstancesFiscalesSection export type ActiviteSectionElement = SectionElement & { periodeId?: 1 | 2 | 3 | 4 } diff --git a/packages/common/src/static/administrations.ts b/packages/common/src/static/administrations.ts index 3c3e9acaa80dbaffd24b1cc3d404e8830298addc..40f6d897eef3c796248ddd6f1b2f516ead809f5d 100644 --- a/packages/common/src/static/administrations.ts +++ b/packages/common/src/static/administrations.ts @@ -2,7 +2,7 @@ import { Definition } from '../definition' import { RegionId } from './region' import { DepartementId } from './departement' import { z } from 'zod' -import { map } from '../typescript-tools' +import { map, toSorted } from '../typescript-tools' const ADMINISTRATION_TYPE_IDS_ARRAY = ['aut', 'dre', 'min', 'ope', 'pre'] as const @@ -1889,4 +1889,7 @@ export const Administrations: { }, } // ----- ne pas supprimer cette ligne : fin -export const sortedAdministrations = map(IDS, id => Administrations[id]).sort((a, b) => a.abreviation.localeCompare(b.abreviation)) +export const sortedAdministrations = toSorted( + map(IDS, id => Administrations[id]), + (a, b) => a.abreviation.localeCompare(b.abreviation) +) diff --git a/packages/common/src/static/documentsTypes.ts b/packages/common/src/static/documentsTypes.ts index 429bf7f0d49b1ca18597da3aeddb9c38e2e16028..2a212684ad378c46e67e34f89a52de047709a203 100644 --- a/packages/common/src/static/documentsTypes.ts +++ b/packages/common/src/static/documentsTypes.ts @@ -1,5 +1,5 @@ import { z } from 'zod' -import { NonEmptyArray, map } from '../typescript-tools' +import { NonEmptyArray, map, toSorted } from '../typescript-tools' export interface DocumentType { id: DocumentTypeId @@ -274,7 +274,10 @@ export const DocumentsTypes: { [key in DocumentTypeId | AutreDocumentTypeId]: De sir: { id: 'sir', nom: 'Avis de situation au répertoire Sirene' }, } -export const sortedEntrepriseDocumentTypes = map(EntrepriseDocumentTypeIds, id => DocumentsTypes[id]).sort((a, b) => a.nom.localeCompare(b.nom)) +export const sortedEntrepriseDocumentTypes = toSorted( + map(EntrepriseDocumentTypeIds, id => DocumentsTypes[id]), + (a, b) => a.nom.localeCompare(b.nom) +) export const sortedDocumentTypes = IDS_WITHOUT_AUTRE.map(id => DocumentsTypes[id]).sort((a, b) => a.nom.localeCompare(b.nom)) export const isDocumentTypeId = (documentTypeId: string | null | undefined): documentTypeId is DocumentTypeId => IDS_WITHOUT_AUTRE.includes(documentTypeId) diff --git a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sdom.ts b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sdom.ts index c9b4d793efcd791ee9a9117a5f66522c773bb973..c3ff6d57cd437bfb57ff406caafe157447be2c6b 100644 --- a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sdom.ts +++ b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sdom.ts @@ -1,4 +1,3 @@ -import { DeepReadonly } from '../../typescript-tools' import { DEMARCHES_TYPES_IDS, DemarcheTypeId } from '../demarchesTypes' import { DOCUMENTS_TYPES_IDS } from '../documentsTypes' import { ETAPES_TYPES, EtapeTypeId } from '../etapesTypes' @@ -6,12 +5,7 @@ import { SDOMZoneId, SDOMZoneIds } from '../sdom' import { TITRES_TYPES_IDS, TitreTypeId } from '../titresTypes' type DocumentTypeIdsBySdomZonesGet = 'nir' | 'jeg' | 'nip' -export const documentTypeIdsBySdomZonesGet = ( - sdomZones: DeepReadonly<SDOMZoneId[]>, - titreTypeId: TitreTypeId, - demarcheTypeId: DemarcheTypeId, - etapeTypeId: EtapeTypeId -): DocumentTypeIdsBySdomZonesGet[] => { +export const documentTypeIdsBySdomZonesGet = (sdomZones: SDOMZoneId[], titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, etapeTypeId: EtapeTypeId): DocumentTypeIdsBySdomZonesGet[] => { const documentTypeIds: DocumentTypeIdsBySdomZonesGet[] = [] // Pour les demandes d'octroi d'AXM diff --git a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts index 46576882418b9d53681b0d375b9c9864933bfbe3..c880a66460e082f3632440f5b4e37767eeaf3173 100644 --- a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts +++ b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts @@ -3,7 +3,7 @@ import { DEMARCHES_TYPES_IDS, DemarcheTypeId } from '../demarchesTypes' import { TITRES_TYPES_IDS, TitreTypeId } from '../titresTypes' import { ETAPES_TYPES, ETAPES_WITH_AUTOMATIC_STATUTS, EtapeTypeId } from '../etapesTypes' import { TDEType } from './index' -import { DeepReadonly, isNotNullNorUndefined, NonEmptyArray } from '../../typescript-tools' +import { isNotNullNorUndefined, NonEmptyArray } from '../../typescript-tools' import { UniteId, uniteIdValidator, Unites } from '../unites' import { DeviseId, sortedDevises } from '../devise' import { z } from 'zod' @@ -208,7 +208,7 @@ const EtapesTypesSections = { ], }, ], -} as const satisfies { [key in EtapeTypeId]?: DeepReadonly<Section[]> } +} as const satisfies { [key in EtapeTypeId]?: Section[] } const proprietesDeLaConcession: Section[] = [ { @@ -959,7 +959,7 @@ const TDESections = { } as const satisfies { [titreKey in keyof TDEType]?: { [demarcheKey in keyof TDEType[titreKey]]?: { - [key in Extract<TDEType[titreKey][demarcheKey], readonly EtapeTypeId[]>[number]]?: DeepReadonly<Section[]> + [key in Extract<TDEType[titreKey][demarcheKey], readonly EtapeTypeId[]>[number]]?: Section[] } } } @@ -1013,11 +1013,11 @@ const isEtapesTypesEtapesTypesSections = (etapeTypeId?: EtapeTypeId): etapeTypeI return Object.keys(EtapesTypesSections).includes(etapeTypeId) } -export const getSections = (titreTypeId: TitreTypeId | undefined, demarcheTypeId: DemarcheTypeId | undefined, etapeTypeId: EtapeTypeId | undefined): DeepReadonly<Section[]> => { +export const getSections = (titreTypeId: TitreTypeId | undefined, demarcheTypeId: DemarcheTypeId | undefined, etapeTypeId: EtapeTypeId | undefined): Section[] => { if (isNotNullNorUndefined(titreTypeId) && isNotNullNorUndefined(demarcheTypeId) && isNotNullNorUndefined(etapeTypeId)) { - const sections: DeepReadonly<Section>[] = [] + const sections: Section[] = [] - type TDESectionsTypesUnleashed = { [key in TitreTypeId]?: { [key in DemarcheTypeId]?: { [key in EtapeTypeId]?: DeepReadonly<Section[]> } } } + type TDESectionsTypesUnleashed = { [key in TitreTypeId]?: { [key in DemarcheTypeId]?: { [key in EtapeTypeId]?: Section[] } } } sections.push(...((TDESections as TDESectionsTypesUnleashed)[titreTypeId]?.[demarcheTypeId]?.[etapeTypeId] ?? [])) @@ -1035,7 +1035,7 @@ export const getSections = (titreTypeId: TitreTypeId | undefined, demarcheTypeId } } -const getElementValeurs = (element: DeepReadonly<SelectElement>): DeepReadonly<{ id: string; nom: string }[]> => { +const getElementValeurs = (element: SelectElement): { id: string; nom: string }[] => { return element.options } @@ -1053,7 +1053,7 @@ export const getElementWithValue = (sectionsWithValue: SectionWithValue[], secti return null } -export const getSectionsWithValue = (sections: DeepReadonly<Section[]>, contenu: Contenu | FlattenEtape['contenu']): SectionWithValue[] => { +export const getSectionsWithValue = (sections: Section[], contenu: Contenu | FlattenEtape['contenu']): SectionWithValue[] => { const sectionsWithValue: SectionWithValue[] = [] sections.forEach(section => { diff --git a/packages/common/src/territoires.ts b/packages/common/src/territoires.ts index c06b2a695bd7ca37555d51997a655547da66db20..d57bac978192571284b080894eead4c94ecd86e0 100644 --- a/packages/common/src/territoires.ts +++ b/packages/common/src/territoires.ts @@ -2,12 +2,12 @@ import { CommuneId } from './static/communes' import { FacadeComputed, FacadesMaritimes, getDepartementsBySecteurs, getFacade, getFacadesComputed, SecteursMaritimes } from './static/facades' import { DepartementId, DepartementLabel, Departements, toDepartementId } from './static/departement' import { RegionId, RegionLabel, Regions } from './static/region' -import { DeepReadonly, onlyUnique, RecordPartial } from './typescript-tools' +import { onlyUnique, RecordPartial } from './typescript-tools' import { PaysId } from './static/pays' export const territoiresFind = ( communesWithName: RecordPartial<CommuneId, string>, - communes?: DeepReadonly<{ id: CommuneId; surface?: number | null }[]> | null | undefined, + communes?: { id: CommuneId; surface?: number | null }[] | null | undefined, secteursMaritime?: SecteursMaritimes[] | null | undefined ): { communes: { nom: string; surface: null | number }[]; departements: DepartementLabel[]; regions: RegionLabel[]; facades: FacadeComputed[] } => { const result: { @@ -56,7 +56,7 @@ export const territoiresFind = ( } export const territoiresIdFind = ( - communes: DeepReadonly<{ id: CommuneId }[]>, + communes: { id: CommuneId }[], secteursMaritime: SecteursMaritimes[] ): { departements: DepartementId[]; regions: RegionId[]; facades: FacadesMaritimes[]; pays: PaysId[] } => { const departements: DepartementId[] = [...getDepartementsBySecteurs(secteursMaritime), ...communes.map(({ id }) => toDepartementId(id))].filter(onlyUnique) diff --git a/packages/common/src/titres.ts b/packages/common/src/titres.ts index 365314ab949e9027545ab107c956d283cdf43179..234907f957f8497efa896072a8504c657514eb07 100644 --- a/packages/common/src/titres.ts +++ b/packages/common/src/titres.ts @@ -9,7 +9,7 @@ import { DemarcheEtape, DemarcheEtapeFondamentale, DemarcheEtapeNonFondamentale, import { demarcheStatutIdValidator } from './static/demarchesStatuts' import { demarcheTypeIdValidator } from './static/demarchesTypes' import { TitreId, titreIdValidator, titreSlugValidator } from './validators/titres' -import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from './typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from './typescript-tools' import { EntrepriseId, entrepriseIdValidator } from './entreprise' import { isFondamentalesStatutOk } from './static/etapesStatuts' import { ETAPE_IS_NOT_BROUILLON, etapeIdValidator } from './etape' @@ -168,4 +168,4 @@ export type TitreDemande = z.infer<typeof titreDemandeValidator> export const titreDemandeOutputValidator = z.object({ etapeId: etapeIdValidator.optional(), titreId: titreIdValidator }) export type TitreDemandeOutput = z.infer<typeof titreDemandeOutputValidator> -export const createAutomaticallyEtapeWhenCreatingTitre = (user: DeepReadonly<User>): boolean => isEntrepriseOrBureauDEtude(user) +export const createAutomaticallyEtapeWhenCreatingTitre = (user: User): boolean => isEntrepriseOrBureauDEtude(user) diff --git a/packages/common/src/typescript-tools.test.ts b/packages/common/src/typescript-tools.test.ts index 74a2d716d517b95730493b3afa80c67857a23846..4313d0058edbd354c1353cf4c3f26edb4b4aadaf 100644 --- a/packages/common/src/typescript-tools.test.ts +++ b/packages/common/src/typescript-tools.test.ts @@ -1,14 +1,4 @@ -import { - exhaustiveCheck, - isNonEmptyArrayAndDeepReadonly, - isNotNullNorUndefined, - isNotNullNorUndefinedNorEmpty, - isNullOrUndefinedOrEmpty, - memoize, - onlyUnique, - stringArrayEquals, - toSorted, -} from './typescript-tools' +import { exhaustiveCheck, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty, memoize, onlyUnique, stringArrayEquals, toSorted } from './typescript-tools' import { Role } from './roles' import { AdministrationId } from './static/administrations' import { Departements } from './static/departement' @@ -51,11 +41,6 @@ test('isNotNullNorUndefinedNorEmpty', () => { expect(isNotNullNorUndefinedNorEmpty(' a ')).toBe(true) }) -test('isNonEmptyArray', () => { - expect(isNonEmptyArrayAndDeepReadonly([])).toBe(false) - expect(isNonEmptyArrayAndDeepReadonly([1])).toBe(true) -}) - test('onlyUnique', () => { const departements = [Departements['01'], Departements['2A'], Departements['02'], Departements['01']] const actual = departements.filter(onlyUnique) diff --git a/packages/common/src/typescript-tools.ts b/packages/common/src/typescript-tools.ts index ab39162ed36ff8bfcc1972969079b1ff5a66e031..185e60a5074337abfff00b1f855f1a84270922ec 100644 --- a/packages/common/src/typescript-tools.ts +++ b/packages/common/src/typescript-tools.ts @@ -6,17 +6,18 @@ export function isNotNullNorUndefined<T>(value: T | null | undefined): value is } // @ts-ignore faisons confiance à notre code -export function toSorted<U>(value: DeepReadonly<U[]>, comparator?: (a: DeepReadonly<U>, b: DeepReadonly<U>) => number): DeepReadonly<U[]> +export function toSorted<U>(value: Readonly<NonEmptyArray<U>>, comparator?: (a: U, b: U) => number): Readonly<NonEmptyArray<U>> +// @ts-ignore faisons confiance à notre code +export function toSorted<U>(value: Readonly<U[]>, comparator?: (a: U, b: U) => number): Readonly<U[]> export function toSorted<U>(value: NonEmptyArray<U>, comparator?: (a: U, b: U) => number): NonEmptyArray<U> export function toSorted<U>(value: U[], comparator?: (a: U, b: U) => number): U[] export function toSorted<U>(value: U[], comparator?: (a: U, b: U) => number): U[] { return [...value].sort(comparator) } -export function isNotNullNorUndefinedNorEmpty<U>(value: DeepReadonly<U[]> | null | undefined): value is DeepReadonly<NonEmptyArray<U>> export function isNotNullNorUndefinedNorEmpty<U>(value: U[] | null | undefined): value is NonEmptyArray<U> export function isNotNullNorUndefinedNorEmpty(value: string | null | undefined): value is string -export function isNotNullNorUndefinedNorEmpty(value: string | DeepReadonly<any[]> | null | undefined): boolean { +export function isNotNullNorUndefinedNorEmpty(value: string | any[] | null | undefined): boolean { if (Array.isArray(value)) { if (!isNullOrUndefined(value)) { return isNonEmptyArray(value) @@ -28,10 +29,9 @@ export function isNotNullNorUndefinedNorEmpty(value: string | DeepReadonly<any[] return false } -export function isNullOrUndefinedOrEmpty<U>(value: DeepReadonly<U[]> | null | undefined): value is null | undefined -export function isNullOrUndefinedOrEmpty<U>(value: U[] | null | undefined): value is null | undefined +export function isNullOrUndefinedOrEmpty<U>(value: Readonly<U[]> | null | undefined): value is null | undefined export function isNullOrUndefinedOrEmpty(value: string | null | undefined): value is null | undefined -export function isNullOrUndefinedOrEmpty(value: string | DeepReadonly<any[]> | null | undefined): boolean { +export function isNullOrUndefinedOrEmpty(value: string | Readonly<any[]> | null | undefined): boolean { if (value === null || value === undefined) { return true } @@ -71,62 +71,16 @@ export const getEntries = <T extends string, U>(object: Record<T, U>, filter: (k // @ts-ignore use with caution export const getEntriesHardcore = <T extends string, U>(object: Record<T, U>): [T, U][] => Object.entries<U>(object) -declare const RefSymbol: unique symbol -interface Ref<T = any> { - value: T - /** - * Type differentiator only. - * We need this to be in public d.ts but don't want it to show up in IDE - * autocomplete, so we use a private Symbol instead. - */ - [RefSymbol]: true -} - -// export type DeepReadonly<T> = { -// readonly [K in keyof T]: DeepReadonly<T[K]> -// } - -type Primitive = string | number | boolean | bigint | symbol | undefined | null -type Builtin = Primitive | Function | Date | Error | RegExp // eslint-disable-line -// DeepReadonly from vue -export type DeepReadonly<T> = T extends Builtin - ? T - : T extends Map<infer K, infer V> - ? ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>> - : T extends ReadonlyMap<infer K, infer V> - ? ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>> - : T extends WeakMap<infer K, infer V> - ? WeakMap<DeepReadonly<K>, DeepReadonly<V>> - : T extends Set<infer U> - ? ReadonlySet<DeepReadonly<U>> - : T extends ReadonlySet<infer U> - ? ReadonlySet<DeepReadonly<U>> - : T extends WeakSet<infer U> - ? WeakSet<DeepReadonly<U>> - : T extends Promise<infer U> - ? Promise<DeepReadonly<U>> - : T extends Ref<infer U> - ? Readonly<Ref<DeepReadonly<U>>> - : T extends {} // eslint-disable-line - ? { - readonly [K in keyof T]: DeepReadonly<T[K]> - } - : Readonly<T> - export const exhaustiveCheck = (param: never): never => { throw new Error(`Unreachable case: ${JSON.stringify(param)}`) } export type NonEmptyArray<T> = [T, ...T[]] -export const isNonEmptyArrayAndDeepReadonly = <T>(arr: DeepReadonly<T[]>): arr is DeepReadonly<NonEmptyArray<T>> => { - return arr.length > 0 -} - export const isNonEmptyArray = <T>(arr: T[]): arr is NonEmptyArray<T> => { return arr.length > 0 } -export const map = <T, U>(array: DeepReadonly<NonEmptyArray<T>>, transform: (item: DeepReadonly<T>) => U): NonEmptyArray<U> => { +export const map = <T, U>(array: Readonly<NonEmptyArray<T>>, transform: (item: T) => U): Readonly<NonEmptyArray<U>> => { const [first, ...rest] = array return [transform(first), ...rest.map(transform)] diff --git a/packages/ui/src/api/client-rest.ts b/packages/ui/src/api/client-rest.ts index b7bff701badf618033ac87ab46689117bb765420..89a5acfde5ca078010016b7843d10b5bdd92cb6c 100644 --- a/packages/ui/src/api/client-rest.ts +++ b/packages/ui/src/api/client-rest.ts @@ -16,7 +16,6 @@ import { } from 'camino-common/src/rest' import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools' import { CaminoError } from 'camino-common/src/zod-tools' -import { DeepReadonly } from 'vue' import { ZodType, z } from 'zod' type Loading = { status: 'LOADING' } @@ -158,13 +157,13 @@ export const newPostWithJson = async <T extends NewPostRestRoutes>( export const putWithJson = async <T extends PutRestRoutes>( path: T, params: CaminoRestParams<T>, - body: DeepReadonly<z.infer<(typeof CaminoRestRoutes)[T]['put']['input']>> + body: z.infer<(typeof CaminoRestRoutes)[T]['put']['input']> ): Promise<z.infer<(typeof CaminoRestRoutes)[T]['put']['output']>> => callFetch(path, params, 'put', {}, body) export const newPutWithJson = async <T extends NewPutRestRoutes>( path: T, params: CaminoRestParams<T>, - body: DeepReadonly<z.infer<(typeof CaminoRestRoutes)[T]['newPut']['input']>> + body: z.infer<(typeof CaminoRestRoutes)[T]['newPut']['input']> ): Promise<CaminoError<string> | z.infer<(typeof CaminoRestRoutes)[T]['newPut']['output']>> => { try { const url = getUiRestRoute(path, params, {}) diff --git a/packages/ui/src/components/_common/dsfr-perimetre-table.tsx b/packages/ui/src/components/_common/dsfr-perimetre-table.tsx index c26e5d129a2848913e4c20d3012b40ed7e9434de..febbb10141689700ea11627a5b8c98ed6fd2f35b 100644 --- a/packages/ui/src/components/_common/dsfr-perimetre-table.tsx +++ b/packages/ui/src/components/_common/dsfr-perimetre-table.tsx @@ -1,6 +1,6 @@ import { contentTypes } from 'camino-common/src/rest' import { GeoSysteme, GeoSystemes, GeoSystemeId } from 'camino-common/src/static/geoSystemes' -import { DeepReadonly, defineComponent, FunctionalComponent } from 'vue' +import { defineComponent, FunctionalComponent } from 'vue' import { DsfrLink } from '../_ui/dsfr-button' import { TableRow, TextColumnData } from '../_ui/table' import { TableAuto, Column } from '../_ui/table-auto' @@ -12,8 +12,8 @@ import { NotNullableKeys, isNotNullNorUndefined } from 'camino-common/src/typesc import { GeoSystemeTypeahead } from './geosysteme-typeahead' interface Props { - geojson_origine_points: DeepReadonly<FeatureCollectionPoints> - geojson_origine_forages: DeepReadonly<FeatureCollectionForages> | null + geojson_origine_points: FeatureCollectionPoints + geojson_origine_forages: FeatureCollectionForages | null geo_systeme_id: GeoSystemeId surface: KM2 | null titreSlug: TitreSlug @@ -26,7 +26,7 @@ const labels = { gon: { x: 'longitude', y: 'latitude' }, } as const satisfies Record<GeoSysteme['uniteId'], { x: string; y: string }> -const geoJsonToArray = (perimetre: DeepReadonly<FeatureCollectionPoints | FeatureCollectionForages>): TableRow<string>[] => { +const geoJsonToArray = (perimetre: FeatureCollectionPoints | FeatureCollectionForages): TableRow<string>[] => { return perimetre.features.map<TableRow<string>>((feature, index) => { const x_deg = toDegresMinutes(feature.geometry.coordinates[0]) const y_deg = toDegresMinutes(feature.geometry.coordinates[1]) @@ -161,7 +161,7 @@ export const TabCaminoTable = defineComponent<Props>(props => { // @ts-ignore waiting for https://github.com/vuejs/core/issues/7833 TabCaminoTable.props = ['geojson_origine_points', 'geojson_origine_forages', 'geo_systeme_id', 'titreSlug', 'maxRows', 'surface'] -export const transformMultipolygonToPoints = (geojson_perimetre: DeepReadonly<FeatureMultiPolygon>): DeepReadonly<FeatureCollectionPoints> => { +export const transformMultipolygonToPoints = (geojson_perimetre: FeatureMultiPolygon): FeatureCollectionPoints => { const currentPoints: (FeatureCollectionPoints['features'][0] & { properties: { latitude: string; longitude: string } })[] = [] let index = 0 geojson_perimetre.geometry.coordinates.forEach((topLevel, topLevelIndex) => diff --git a/packages/ui/src/components/_common/dsfr-perimetre.tsx b/packages/ui/src/components/_common/dsfr-perimetre.tsx index 110c67c7de9973466b5d3bd3779095f7f4c998eb..90424fc84386ced3fc79241f6857c7474b0592a2 100644 --- a/packages/ui/src/components/_common/dsfr-perimetre.tsx +++ b/packages/ui/src/components/_common/dsfr-perimetre.tsx @@ -1,4 +1,4 @@ -import { defineComponent, HTMLAttributes, defineAsyncComponent, computed, DeepReadonly } from 'vue' +import { defineComponent, HTMLAttributes, defineAsyncComponent, computed } from 'vue' import { Tab, Tabs } from '../_ui/tabs' import { TitreSlug } from 'camino-common/src/validators/titres' import { FeatureCollection, FeatureCollectionForages, FeatureCollectionPoints, FeatureMultiPolygon } from 'camino-common/src/perimetre' @@ -14,7 +14,7 @@ import { CaminoRouter } from '@/typings/vue-router' export type TabId = 'carte' | 'points' type Props = { - perimetre: DeepReadonly<{ + perimetre: { geojson4326_perimetre: FeatureMultiPolygon geojson4326_points: FeatureCollectionPoints | null geojson_origine_geo_systeme_id: GeoSystemeId @@ -23,7 +23,7 @@ type Props = { geojson4326_forages: FeatureCollectionForages | null geojson_origine_forages: FeatureCollectionForages | null surface: KM2 | null - }> + } titreSlug: TitreSlug titreTypeId: TitreTypeId initTab?: TabId @@ -37,14 +37,14 @@ const maxRows = 20 * */ export const DsfrPerimetre = defineComponent<Props>((props: Props) => { - const geojson4326Points = computed<DeepReadonly<FeatureCollectionPoints>>(() => { + const geojson4326Points = computed<FeatureCollectionPoints>(() => { if (isNotNullNorUndefined(props.perimetre.geojson4326_points)) { return props.perimetre.geojson4326_points } return transformMultipolygonToPoints(props.perimetre.geojson4326_perimetre) }) - const geojsonOriginePoints = computed<DeepReadonly<FeatureCollectionPoints>>(() => { + const geojsonOriginePoints = computed<FeatureCollectionPoints>(() => { if (isNotNullNorUndefined(props.perimetre.geojson_origine_points)) { return props.perimetre.geojson_origine_points } @@ -80,7 +80,7 @@ export const DsfrPerimetre = defineComponent<Props>((props: Props) => { }) type TabCaminoMapProps = OmitDistributive<Props, 'perimetre'> & { - perimetre: DeepReadonly<{ + perimetre: { geojson4326_perimetre: FeatureMultiPolygon geojson4326_points: FeatureCollectionPoints geojson_origine_geo_systeme_id: GeoSystemeId @@ -88,7 +88,7 @@ type TabCaminoMapProps = OmitDistributive<Props, 'perimetre'> & { geojson_origine_points: FeatureCollectionPoints geojson4326_forages: FeatureCollectionForages | null surface: KM2 | null - }> + } } const TabCaminoMap = defineComponent<TabCaminoMapProps>(props => { const neighbours = props.calculateNeighbours ? { apiClient: props.apiClient, titreSlug: props.titreSlug, router: props.router } : null @@ -99,14 +99,14 @@ const TabCaminoMap = defineComponent<TabCaminoMapProps>(props => { return DemarcheMap }) - const geojson_origine = computed<DeepReadonly<FeatureCollection>>(() => ({ + const geojson_origine = computed<FeatureCollection>(() => ({ type: 'FeatureCollection', crs: { type: 'name', properties: { name: `urn:ogc:def:crs:EPSG::${props.perimetre.geojson_origine_geo_systeme_id}` } }, properties: null, features: [props.perimetre.geojson_origine_perimetre, ...props.perimetre.geojson_origine_points.features], })) - const geojson_4326 = computed<DeepReadonly<FeatureCollection>>(() => ({ + const geojson_4326 = computed<FeatureCollection>(() => ({ type: 'FeatureCollection', crs: { type: 'name', properties: { name: 'urn:ogc:def:crs:EPSG::4326' } }, properties: null, diff --git a/packages/ui/src/components/_common/new-sections-edit.stories.tsx b/packages/ui/src/components/_common/new-sections-edit.stories.tsx index b1c228f1e86b0e693041cb17ff6c3bc8013abb30..1ba5c035ad7aa27045a5c4be8fcc08254f87c811 100644 --- a/packages/ui/src/components/_common/new-sections-edit.stories.tsx +++ b/packages/ui/src/components/_common/new-sections-edit.stories.tsx @@ -6,7 +6,7 @@ import { UNITES, Unite, Unites } from 'camino-common/src/static/unites' import { ActiviteSectionElement, ActivitesTypes, isSubstancesFiscales } from 'camino-common/src/static/activitesTypes' import { getSectionsWithValue, sectionDureeIds } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' import { SubstancesFiscale } from 'camino-common/src/static/substancesFiscales' -import { DeepReadonly, NonEmptyArray } from 'camino-common/src/typescript-tools' +import { NonEmptyArray } from 'camino-common/src/typescript-tools' const meta: Meta = { title: 'Components/Common/SectionsEdit', @@ -524,7 +524,7 @@ export const ToutesLesActivites: StoryFn = () => ( ...section, elements: [SubstancesFiscale.auru].map(sf => { const unite = Unites[sf.uniteId] - const element: DeepReadonly<ActiviteSectionElement> = { + const element: ActiviteSectionElement = { id: sf.id, nom: `${sf.nom}`, type: 'number', diff --git a/packages/ui/src/components/_common/new-sections-edit.tsx b/packages/ui/src/components/_common/new-sections-edit.tsx index 7e7d26048a88bf5941cac7c8b265f359e07785b9..5a4914a41905ed2bc269909f2a057725d9f9c607 100644 --- a/packages/ui/src/components/_common/new-sections-edit.tsx +++ b/packages/ui/src/components/_common/new-sections-edit.tsx @@ -1,4 +1,4 @@ -import { defineComponent, ref, watch, DeepReadonly, FunctionalComponent } from 'vue' +import { defineComponent, ref, watch, FunctionalComponent } from 'vue' import { ElementWithValue, isNumberElement, isRadioElement, SectionWithValue } from 'camino-common/src/sections' import { exhaustiveCheck, isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools' import { numberFormat } from 'camino-common/src/number' @@ -14,13 +14,13 @@ import { useState } from '../../utils/vue-tsx-utils' import { CaminoDate, dateAddDays, dateFormat } from 'camino-common/src/date' import { sectionDureeIds } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' interface Props { - sectionsWithValue: DeepReadonly<SectionWithValue[]> + sectionsWithValue: SectionWithValue[] completeUpdate: (complete: boolean, newContenu: Props['sectionsWithValue']) => void etapeDate: CaminoDate | null } export const SectionsEdit = defineComponent<Props>(props => { - const [sectionsWithValue, setSectionsWithValue] = useState<DeepReadonly<SectionWithValue[]>>([]) + const [sectionsWithValue, setSectionsWithValue] = useState<SectionWithValue[]>([]) watch( () => props.sectionsWithValue, @@ -31,8 +31,8 @@ export const SectionsEdit = defineComponent<Props>(props => { { immediate: true } ) - const onValueChange = (elementIndex: number, sectionIndex: number) => (elementWithValue: DeepReadonly<ElementWithValue>) => { - const newSectionsWithValue: DeepReadonly<SectionWithValue[]> = sectionsWithValue.value.map((section, index) => { + const onValueChange = (elementIndex: number, sectionIndex: number) => (elementWithValue: ElementWithValue) => { + const newSectionsWithValue: SectionWithValue[] = sectionsWithValue.value.map((section, index) => { if (index === sectionIndex) { return { ...section, @@ -78,13 +78,13 @@ export const SectionsEdit = defineComponent<Props>(props => { SectionsEdit.props = ['sectionsWithValue', 'completeUpdate', 'etapeDate'] interface SectionElementEditProps { - element: DeepReadonly<ElementWithValue> + element: ElementWithValue onValueChange: (value: SectionElementEditProps['element']) => void sectionId: string etapeDate: CaminoDate | null } -export const getInfo = (element: DeepReadonly<ElementWithValue>, sectionId: string, etapeDate: CaminoDate | null): string => { +export const getInfo = (element: ElementWithValue, sectionId: string, etapeDate: CaminoDate | null): string => { if (isNotNullNorUndefined(element.value)) { if (element.id === 'volumeGranulatsExtrait' && isNumberElement(element)) { return `Soit l’équivalent de ${numberFormat(element.value * 1.5)} tonnes` @@ -105,7 +105,7 @@ export const getInfo = (element: DeepReadonly<ElementWithValue>, sectionId: stri export const SectionElementEdit = defineComponent<SectionElementEditProps>(props => { const complete = ref<boolean>(sectionElementWithValueCompleteValidate(props.element)) - const onValueChange = (value: DeepReadonly<ElementWithValue>) => { + const onValueChange = (value: ElementWithValue) => { complete.value = sectionElementWithValueCompleteValidate(value) props.onValueChange(value) } diff --git a/packages/ui/src/components/_ui/dsfr-input-checkboxes.tsx b/packages/ui/src/components/_ui/dsfr-input-checkboxes.tsx index 89bc2ad3e9d3bfea261bd494e0fd249e671c6e1a..a537d7e008dfad7bb3e3ba8e78dd036b425d122d 100644 --- a/packages/ui/src/components/_ui/dsfr-input-checkboxes.tsx +++ b/packages/ui/src/components/_ui/dsfr-input-checkboxes.tsx @@ -1,22 +1,22 @@ import { random } from '@/utils/vue-tsx-utils' import { DsfrInputCheckbox, Props as InputCheckboxProps } from './dsfr-input-checkbox' import { Ref, defineComponent, ref, watch } from 'vue' -import { DeepReadonly, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' type Props<T extends string> = { id?: string legend: { main: string; description?: string } disabled?: boolean - valueChanged: (values: DeepReadonly<T[]>) => void + valueChanged: (values: T[]) => void size?: 'sm' | 'md' - elements: (Omit<InputCheckboxProps, 'disabled' | 'id' | 'valueChanged' | 'initialValue'> & { itemId: DeepReadonly<T> })[] - initialCheckedValue: DeepReadonly<NoInfer<T>[]> + elements: (Omit<InputCheckboxProps, 'disabled' | 'id' | 'valueChanged' | 'initialValue'> & { itemId: T })[] + initialCheckedValue: NoInfer<T[]> } export const DsfrInputCheckboxes = defineComponent(<T extends string>(props: Props<T>) => { const id = props.id ?? `checkboxes_${(random() * 1000).toFixed()}` - const values = ref<DeepReadonly<T[]>>(props.elements.filter(element => props.initialCheckedValue.includes(element.itemId)).map(({ itemId }) => itemId)) as Ref<DeepReadonly<T[]>> + const values = ref<T[]>(props.elements.filter(element => props.initialCheckedValue.includes(element.itemId)).map(({ itemId }) => itemId)) as Ref<T[]> watch( () => props.elements, () => { @@ -36,7 +36,7 @@ export const DsfrInputCheckboxes = defineComponent(<T extends string>(props: Pro { deep: true } ) - const updateCheckbox = (itemId: DeepReadonly<T>) => (checked: boolean) => { + const updateCheckbox = (itemId: T) => (checked: boolean) => { if (checked) { values.value = [...values.value, itemId] } else { diff --git a/packages/ui/src/components/_ui/dsfr-select.tsx b/packages/ui/src/components/_ui/dsfr-select.tsx index b843be77fbd4701af5b15c10530880129d17a8c7..61ff1d06149e3e18d13938def4e920600b5724da 100644 --- a/packages/ui/src/components/_ui/dsfr-select.tsx +++ b/packages/ui/src/components/_ui/dsfr-select.tsx @@ -1,19 +1,19 @@ import { NonEmptyArray, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' import { isEventWithTarget, random } from '../../utils/vue-tsx-utils' -import { DeepReadonly, HTMLAttributes } from 'vue' +import { HTMLAttributes } from 'vue' import type { JSX } from 'vue/jsx-runtime' export type Item<T> = { id: T; label: string; disabled?: boolean } -type Props<T, Items extends DeepReadonly<NonEmptyArray<Item<T>>>> = { +type Props<T, Items extends Readonly<NonEmptyArray<Item<T>>>> = { id?: string items: Items legend: { main: string; visible?: boolean; description?: string; placeholder?: string } initialValue: Items[number]['id'] | null required?: boolean disabled?: boolean - valueChanged: (id: DeepReadonly<Items[number]['id'] | null>) => void + valueChanged: (id: NoInfer<Items>[number]['id'] | null) => void } & HTMLAttributes -export const DsfrSelect = <T, Items extends DeepReadonly<NonEmptyArray<Item<T>>>>(props: Props<T, Items>): JSX.Element => { +export const DsfrSelect = <T, Items extends Readonly<NonEmptyArray<Item<T>>>>(props: Props<T, Items>): JSX.Element => { const id = props.id ?? `select_${(random() * 1000).toFixed()}` return ( @@ -32,7 +32,7 @@ export const DsfrSelect = <T, Items extends DeepReadonly<NonEmptyArray<Item<T>>> disabled={props.disabled ?? false} name={id} value={props.initialValue} - onChange={event => (isEventWithTarget(event) ? props.valueChanged(event.target.value as DeepReadonly<Items[number]['id']>) : null)} + onChange={event => (isEventWithTarget(event) ? props.valueChanged(event.target.value as Items[number]['id']) : null)} > {props.items.map(({ id, label, disabled }) => ( <option value={id} selected={props.initialValue === id} disabled={disabled}> diff --git a/packages/ui/src/components/_ui/filters/filters.tsx b/packages/ui/src/components/_ui/filters/filters.tsx index eac35d776d543fba0f8a52a108267f065e68492f..55f3636bfcff9a33cfc62304bcbc2788d2340b1a 100644 --- a/packages/ui/src/components/_ui/filters/filters.tsx +++ b/packages/ui/src/components/_ui/filters/filters.tsx @@ -182,7 +182,7 @@ export const Filters = defineComponent((props: Props) => { } if ((filterType.type === 'autocomplete' || filterType.type === 'checkboxes') && isNotNullNorUndefined(nonValidatedValues.value[filter])) { return nonValidatedValues.value[filterType.id].map<FormatedLabel>(v => { - let elements: { id: string; nom: string }[] = [] + let elements: Readonly<{ id: string; nom: string }[]> = [] if (filterType.id === 'titresIds') { elements = titresIds.elements } else if (filterType.id === 'entreprisesIds') { diff --git a/packages/ui/src/components/_ui/typeahead-single.tsx b/packages/ui/src/components/_ui/typeahead-single.tsx index 745e341bce36c4b4d1b868fb7514907672e2b168..5db617e21d55cb8f7c3168bde0e3107cded5efa3 100644 --- a/packages/ui/src/components/_ui/typeahead-single.tsx +++ b/packages/ui/src/components/_ui/typeahead-single.tsx @@ -1,11 +1,11 @@ import { computed, Ref, ref, watch, defineComponent } from 'vue' import styles from './typeahead.module.css' import { isEventWithTarget, random } from '@/utils/vue-tsx-utils' -import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' import type { JSX } from 'vue/jsx-runtime' type TypeAheadRecord = Record<string | symbol | number, any> -type Props<T extends DeepReadonly<TypeAheadRecord>, K extends keyof DeepReadonly<T>> = { +type Props<T extends TypeAheadRecord, K extends keyof T> = { overrideItem: (Pick<T, K> & Partial<Omit<T, K>>) | null disabled?: boolean props: { @@ -22,7 +22,7 @@ type Props<T extends DeepReadonly<TypeAheadRecord>, K extends keyof DeepReadonly } } -export const TypeAheadSingle = defineComponent(<T extends DeepReadonly<TypeAheadRecord>, K extends keyof DeepReadonly<T>>(props: Props<T, K>) => { +export const TypeAheadSingle = defineComponent(<T extends TypeAheadRecord, K extends keyof T>(props: Props<T, K>) => { const id = props.props.id ?? `typeahead_${(random() * 1000).toFixed()}` const wrapperId = computed(() => `${id}_wrapper`) const getItem = (item: (Pick<T, K> & Partial<Omit<T, K>>) | null): T | null => diff --git a/packages/ui/src/components/_ui/typeahead-smart-single.tsx b/packages/ui/src/components/_ui/typeahead-smart-single.tsx index fdf321eec01b5a816b12e371ce8d42c4ed3dd414..0a09e38d0dfd004803cb83a1968437d085497eaf 100644 --- a/packages/ui/src/components/_ui/typeahead-smart-single.tsx +++ b/packages/ui/src/components/_ui/typeahead-smart-single.tsx @@ -1,26 +1,26 @@ import { Ref, computed, defineComponent, ref } from 'vue' import { TypeAheadSingle } from './typeahead-single' -import { DeepReadonly, isNotNullNorUndefined } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools' type Props<T extends string> = { alwaysOpen?: boolean - possibleValues: DeepReadonly<TypeaheadValue<T>>[] - initialValue?: DeepReadonly<NoInfer<T>> - valueIdSelected: (valueId: DeepReadonly<NoInfer<T>> | null) => void + possibleValues: TypeaheadValue<T>[] + initialValue?: NoInfer<T> + valueIdSelected: (valueId: NoInfer<T> | null) => void } type TypeaheadValue<T> = { id: T; nom: string } export const TypeaheadSmartSingle = defineComponent(<T extends string>(props: Props<T>) => { - const valueTypeSelected = ref<DeepReadonly<TypeaheadValue<T>> | null>(props.possibleValues.find(({ id }) => props.initialValue === id) ?? null) as Ref<DeepReadonly<TypeaheadValue<T>> | null> - const onValueUpdate = async (value: DeepReadonly<TypeaheadValue<T>> | undefined) => { + const valueTypeSelected = ref<TypeaheadValue<T> | null>(props.possibleValues.find(({ id }) => props.initialValue === id) ?? null) as Ref<TypeaheadValue<T> | null> + const onValueUpdate = async (value: TypeaheadValue<T> | undefined) => { valueTypeSelected.value = value ?? null props.valueIdSelected(isNotNullNorUndefined(value) ? value.id : null) } - const sortedByUs = computed<DeepReadonly<TypeaheadValue<T>>[]>(() => [...props.possibleValues].sort((a, b) => a.nom.localeCompare(b.nom))) + const sortedByUs = computed<TypeaheadValue<T>[]>(() => [...props.possibleValues].sort((a, b) => a.nom.localeCompare(b.nom))) - const valuesFiltered = ref<DeepReadonly<TypeaheadValue<T>>[]>(sortedByUs.value) as Ref<DeepReadonly<TypeaheadValue<T>>[]> + const valuesFiltered = ref<TypeaheadValue<T>[]>(sortedByUs.value) as Ref<TypeaheadValue<T>[]> const onInput = (search: string) => { const formatedSearch = search.trim().toLowerCase() diff --git a/packages/ui/src/components/activite-edition.tsx b/packages/ui/src/components/activite-edition.tsx index 9419c2488a68d105c2b076dcce7a3985022a8329..a53ec8d35c278fc093d357e40eb72b645431ee73 100644 --- a/packages/ui/src/components/activite-edition.tsx +++ b/packages/ui/src/components/activite-edition.tsx @@ -1,6 +1,6 @@ import { ActiviteDocumentsEdit } from './activite/activite-documents-edit' import { getPeriode } from 'camino-common/src/static/frequence' -import { DeepReadonly, computed, defineComponent, onBeforeUnmount, onMounted, ref } from 'vue' +import { computed, defineComponent, onBeforeUnmount, onMounted, ref } from 'vue' import { AsyncData } from '@/api/client-rest' import { Activite, ActiviteDocumentId, ActiviteId, ActiviteIdOrSlug, TempActiviteDocument, activiteIdOrSlugValidator } from 'camino-common/src/activite' import { useRouter } from 'vue-router' @@ -55,7 +55,7 @@ export const PureActiviteEdition = defineComponent<Props>(props => { activiteDocumentIds: [], tempsDocuments: [], }) - const sectionsComplete = ref<{ complete: boolean; sectionsWithValue: DeepReadonly<SectionWithValue[]> }>({ complete: false, sectionsWithValue: [] }) + const sectionsComplete = ref<{ complete: boolean; sectionsWithValue: SectionWithValue[] }>({ complete: false, sectionsWithValue: [] }) const data = ref<AsyncData<Activite>>({ status: 'LOADING' }) @@ -126,7 +126,7 @@ export const PureActiviteEdition = defineComponent<Props>(props => { documentsComplete.value = { complete, activiteDocumentIds, tempsDocuments } } - const sectionsUpdate = (complete: boolean, sectionsWithValue: DeepReadonly<SectionWithValue[]>) => { + const sectionsUpdate = (complete: boolean, sectionsWithValue: SectionWithValue[]) => { sectionsComplete.value = { complete, sectionsWithValue } } diff --git a/packages/ui/src/components/activite/activite-api-client.ts b/packages/ui/src/components/activite/activite-api-client.ts index 4a4374c4f3c2c82fd4c66502a5d43ec1f8054727..ca9de4ddf11dfe4d292af76242c8c18ed7a2055d 100644 --- a/packages/ui/src/components/activite/activite-api-client.ts +++ b/packages/ui/src/components/activite/activite-api-client.ts @@ -6,7 +6,6 @@ import { ActivitesTypesId } from 'camino-common/src/static/activitesTypes' import gql from 'graphql-tag' import { deleteWithJson, getWithJson, putWithJson } from '../../api/client-rest' import { SectionWithValue } from 'camino-common/src/sections' -import { DeepReadonly } from 'vue' import { EntrepriseId } from 'camino-common/src/entreprise' export interface UiGraphqlActivite { @@ -31,7 +30,7 @@ export interface ActiviteApiClient { updateActivite: ( activiteId: ActiviteId, activiteTypeId: ActivitesTypesId, - sectionsWithValue: DeepReadonly<SectionWithValue[]>, + sectionsWithValue: SectionWithValue[], activiteDocumentIds: ActiviteDocumentId[], newTempDocuments: TempActiviteDocument[] ) => Promise<void> @@ -122,7 +121,7 @@ export const activiteApiClient: ActiviteApiClient = { updateActivite: async ( activiteId: ActiviteId, _activiteTypeId: ActivitesTypesId, - sectionsWithValue: DeepReadonly<SectionWithValue[]>, + sectionsWithValue: SectionWithValue[], activiteDocumentIds: ActiviteDocumentId[], newTempDocuments: TempActiviteDocument[] ) => { diff --git a/packages/ui/src/components/demarche/demarche-map-layer-controls.tsx b/packages/ui/src/components/demarche/demarche-map-layer-controls.tsx index cabfc62e8b12605473f5d7f280d02d4a495abb09..b58c3a51eb768f0dda65ea78e5832a1f28aa2843 100644 --- a/packages/ui/src/components/demarche/demarche-map-layer-controls.tsx +++ b/packages/ui/src/components/demarche/demarche-map-layer-controls.tsx @@ -1,4 +1,4 @@ -import { HTMLAttributes, defineComponent, computed, DeepReadonly } from 'vue' +import { HTMLAttributes, defineComponent, computed } from 'vue' import 'maplibre-gl/dist/maplibre-gl.css' import { DsfrSeparator } from '../_ui/dsfr-separator' import { useState } from '@/utils/vue-tsx-utils' @@ -87,7 +87,7 @@ export const LayersControl = defineComponent<LayersControlProps>(props => { props.setLayer(layer) } - const checkboxValueChanged = (overlayLayerNames: DeepReadonly<OverlayName[]>) => { + const checkboxValueChanged = (overlayLayerNames: OverlayName[]) => { updateSelectedLayers(overlayLayerNames) props.selectedOverlayLayerNames(overlayLayerNames) } diff --git a/packages/ui/src/components/demarche/demarche-map.tsx b/packages/ui/src/components/demarche/demarche-map.tsx index 637f0ebfef0ebb08489527f83344fb1af9a9e458..595b259aee5bc32d3b44e644472486002538c1df 100644 --- a/packages/ui/src/components/demarche/demarche-map.tsx +++ b/packages/ui/src/components/demarche/demarche-map.tsx @@ -1,4 +1,4 @@ -import { HTMLAttributes, defineComponent, onMounted, ref, Ref, computed, watch, onUnmounted, DeepReadonly } from 'vue' +import { HTMLAttributes, defineComponent, onMounted, ref, Ref, computed, watch, onUnmounted } from 'vue' import { FullscreenControl, Map, NavigationControl, StyleSpecification, LayerSpecification, LngLatBounds, SourceSpecification, Popup } from 'maplibre-gl' import 'maplibre-gl/dist/maplibre-gl.css' import { FeatureCollectionForages, FeatureCollectionPoints, FeatureMultiPolygon, ForageType, featureForagePropertiesValidator } from 'camino-common/src/perimetre' @@ -35,7 +35,7 @@ import { import { CaminoRouter } from '@/typings/vue-router' type Props = { - perimetre: DeepReadonly<{ geojson4326_perimetre: FeatureMultiPolygon; geojson4326_points: FeatureCollectionPoints; geojson4326_forages: FeatureCollectionForages | null }> + perimetre: { geojson4326_perimetre: FeatureMultiPolygon; geojson4326_points: FeatureCollectionPoints; geojson4326_forages: FeatureCollectionForages | null } maxMarkers: number style?: HTMLAttributes['style'] class?: HTMLAttributes['class'] @@ -260,7 +260,7 @@ export const DemarcheMap = defineComponent<Props>(props => { return values }) - const points = computed<DeepReadonly<FeatureCollectionPoints>>(() => { + const points = computed<FeatureCollectionPoints>(() => { return { type: 'FeatureCollection', features: props.perimetre.geojson4326_points.features.map(feature => { @@ -269,7 +269,7 @@ export const DemarcheMap = defineComponent<Props>(props => { } }) - const forages = computed<DeepReadonly<FeatureCollectionForages>>(() => { + const forages = computed<FeatureCollectionForages>(() => { return { type: 'FeatureCollection', features: diff --git a/packages/ui/src/components/entreprise/add-entreprise-document-popup.tsx b/packages/ui/src/components/entreprise/add-entreprise-document-popup.tsx index d0d23bce9fa1bcedfcd34446d098f1e7713b6084..3293c71157187e36d086a743322902ed42309bd7 100644 --- a/packages/ui/src/components/entreprise/add-entreprise-document-popup.tsx +++ b/packages/ui/src/components/entreprise/add-entreprise-document-popup.tsx @@ -8,7 +8,7 @@ import { InputFile } from '../_ui/dsfr-input-file' import { ApiClient } from '@/api/api-client' import { DsfrInput } from '../_ui/dsfr-input' import { DsfrSelect } from '../_ui/dsfr-select' -import { DeepReadonly, map } from 'camino-common/src/typescript-tools' +import { map } from 'camino-common/src/typescript-tools' interface Props { close: () => void @@ -17,7 +17,7 @@ interface Props { apiClient: Pick<ApiClient, 'creerEntrepriseDocument' | 'uploadTempDocument'> } export const AddEntrepriseDocumentPopup = defineComponent<Props>(props => { - const entrepriseDocumentTypeId = ref<DeepReadonly<(typeof EntrepriseDocumentTypeIds)[number]> | null>(props.lockedEntrepriseDocumentTypeId ?? null) + const entrepriseDocumentTypeId = ref<(typeof EntrepriseDocumentTypeIds)[number] | null>(props.lockedEntrepriseDocumentTypeId ?? null) const documentDate = ref<CaminoDate | null>(null) const entrepriseDocumentFile = ref<File | null>(null) const documentDescription = ref<string>('') @@ -36,7 +36,7 @@ export const AddEntrepriseDocumentPopup = defineComponent<Props>(props => { const documentsTypes = map(sortedEntrepriseDocumentTypes, edt => ({ id: edt.id, label: edt.nom })) - const typeChange = (e: DeepReadonly<EntrepriseDocumentTypeId> | null) => { + const typeChange = (e: EntrepriseDocumentTypeId | null) => { entrepriseDocumentTypeId.value = e } const content = () => ( diff --git a/packages/ui/src/components/etape-edition.tsx b/packages/ui/src/components/etape-edition.tsx index 3b1fdc21ab669a0a659deb0686864af231419521..5efe0004f50971a4cdc19c6b1d90cc8f35bdbd17 100644 --- a/packages/ui/src/components/etape-edition.tsx +++ b/packages/ui/src/components/etape-edition.tsx @@ -1,4 +1,4 @@ -import { DeepReadonly, computed, defineComponent, inject, onMounted, ref } from 'vue' +import { computed, defineComponent, inject, onMounted, ref } from 'vue' import { useRoute, useRouter } from 'vue-router' import { ApiClient, apiClient } from '../api/api-client' import { DemarcheId, DemarcheIdOrSlug, demarcheIdOrSlugValidator } from 'camino-common/src/demarche' @@ -84,7 +84,7 @@ const helpVisible = (user: User, titreTypeId: TitreTypeId, etapeTypeId: EtapeTyp } export const PureEtapeEdition = defineComponent<Props>(props => { - const [asyncData, setAsyncData] = useState<AsyncData<DeepReadonly<{ etape: EtapeEditFormProps['etape']; demarche: GetDemarcheByIdOrSlug; perimetre: PerimetreInformations }>>>({ + const [asyncData, setAsyncData] = useState<AsyncData<{ etape: EtapeEditFormProps['etape']; demarche: GetDemarcheByIdOrSlug; perimetre: PerimetreInformations }>>({ status: 'LOADING', }) diff --git a/packages/ui/src/components/etape/add-etape-avis-popup.tsx b/packages/ui/src/components/etape/add-etape-avis-popup.tsx index ca1e8247092c5fa67a320a0b0de008a0bd7a446b..ea9a27bc60e8f9542b8021c2d6e300a72fa50982 100644 --- a/packages/ui/src/components/etape/add-etape-avis-popup.tsx +++ b/packages/ui/src/components/etape/add-etape-avis-popup.tsx @@ -1,6 +1,6 @@ import { computed, defineComponent, ref } from 'vue' import { FunctionalPopup } from '../_ui/functional-popup' -import { AVIS_VISIBILITY_IDS, AvisTypeId, AvisTypes, AvisVisibilityId, AvisVisibilityIds } from 'camino-common/src/static/avisTypes' +import { AVIS_VISIBILITY_IDS, AvisStatutId, AvisTypeId, AvisTypes, AvisVisibilityId, AvisVisibilityIds } from 'camino-common/src/static/avisTypes' import { InputFile } from '../_ui/dsfr-input-file' import { ApiClient } from '@/api/api-client' import { TempDocumentName } from 'camino-common/src/document' @@ -28,7 +28,7 @@ export const AddEtapeAvisPopup = defineComponent<Props>(props => { const etapeAvisFile = ref<File | null>(null) const avisDescription = ref<string>(props.initialAvis?.description ?? '') const [avisDate, setAvisDate] = useState(props.initialAvis?.date ?? null) - const [avisStatutId, setAvisStatutId] = useState(props.initialAvis?.avis_statut_id ?? null) + const [avisStatutId, setAvisStatutId] = useState<AvisStatutId | null>(props.initialAvis?.avis_statut_id ?? null) const [avisVisibilityId, setAvisVisibilityId] = useState(props.initialAvis?.avis_visibility_id ?? null) const tempAvisName = ref<TempDocumentName | undefined>(isNotNullNorUndefined(props.initialAvis) && 'temp_document_name' in props.initialAvis ? props.initialAvis.temp_document_name : undefined) @@ -87,7 +87,7 @@ export const AddEtapeAvisPopup = defineComponent<Props>(props => { legend={{ main: 'Statut' }} disabled={isNullOrUndefined(etapeAvisTypeId.value)} required={true} - items={map(etapeAvisTypeId.value ? AvisTypes[etapeAvisTypeId.value].statutIds : ['Non renseigné'], avis => ({ id: avis, label: avis }))} + items={map(etapeAvisTypeId.value ? AvisTypes[etapeAvisTypeId.value].statutIds : (['Non renseigné'] as NonEmptyArray<AvisStatutId>), avis => ({ id: avis, label: avis }))} initialValue={avisStatutId.value} valueChanged={setAvisStatutId} /> diff --git a/packages/ui/src/components/etape/autocomplete-entreprise-single.tsx b/packages/ui/src/components/etape/autocomplete-entreprise-single.tsx index daa41c9b8b1e77922dd88cd6b05faa4fe96ed6c3..7930f41ea9c467db40301eb52e8597a714a24f2a 100644 --- a/packages/ui/src/components/etape/autocomplete-entreprise-single.tsx +++ b/packages/ui/src/components/etape/autocomplete-entreprise-single.tsx @@ -1,18 +1,18 @@ import { useState } from '@/utils/vue-tsx-utils' -import { DeepReadonly, computed, defineComponent, ref, watch } from 'vue' +import { computed, defineComponent, ref, watch } from 'vue' import { EntrepriseId, Entreprise } from 'camino-common/src/entreprise' import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools' import { TypeAheadSingle } from '../_ui/typeahead-single' interface Props { - initialValue?: DeepReadonly<EntrepriseId | null> - items: DeepReadonly<Entreprise>[] - onUpdate: (entreprise: DeepReadonly<EntrepriseId | null>) => void + initialValue?: EntrepriseId | null + items: Entreprise[] + onUpdate: (entreprise: EntrepriseId | null) => void id?: string } export const AutocompleteEntrepriseSingle = defineComponent<Props>(props => { - const [currentEntrepriseId, setCurrentEntrepriseId] = useState<DeepReadonly<EntrepriseId | null>>(props.initialValue ?? null) + const [currentEntrepriseId, setCurrentEntrepriseId] = useState<EntrepriseId | null>(props.initialValue ?? null) const currentSearch = ref<string>('') watch( @@ -35,7 +35,7 @@ export const AutocompleteEntrepriseSingle = defineComponent<Props>(props => { setCurrentEntrepriseId(entreprise?.id ?? null) } - const filteredItems = computed<DeepReadonly<Entreprise>[]>(() => { + const filteredItems = computed<Entreprise[]>(() => { if (currentSearch.value.length === 0) { return props.items } diff --git a/packages/ui/src/components/etape/autocomplete-entreprises.tsx b/packages/ui/src/components/etape/autocomplete-entreprises.tsx index 6fb02269bc7be823425b8a2d4de24bb457d06dc0..1d43df140f8e1066e645837bee2b3c072157e74a 100644 --- a/packages/ui/src/components/etape/autocomplete-entreprises.tsx +++ b/packages/ui/src/components/etape/autocomplete-entreprises.tsx @@ -1,18 +1,18 @@ import { useState } from '@/utils/vue-tsx-utils' -import { DeepReadonly, computed, defineComponent, watch } from 'vue' +import { computed, defineComponent, watch } from 'vue' import { EntrepriseId, Entreprise } from 'camino-common/src/entreprise' import { isNullOrUndefinedOrEmpty, stringArrayEquals } from 'camino-common/src/typescript-tools' import { TypeAheadSmartMultiple } from '../_ui/typeahead-smart-multiple' interface Props { - nonSelectableEntities?: DeepReadonly<EntrepriseId[]> - selectedEntities?: DeepReadonly<EntrepriseId[]> - allEntities: DeepReadonly<Entreprise[]> + nonSelectableEntities?: EntrepriseId[] + selectedEntities?: EntrepriseId[] + allEntities: Entreprise[] name: 'titulaires' | 'amodiataires' - onEntreprisesUpdate: (entreprise: DeepReadonly<EntrepriseId[]>) => void + onEntreprisesUpdate: (entreprise: EntrepriseId[]) => void } export const AutocompleteEntreprises = defineComponent<Props>(props => { - const [mySelectedEntities, setMySelectedEntities] = useState<DeepReadonly<EntrepriseId[]>>(props.selectedEntities ?? []) + const [mySelectedEntities, setMySelectedEntities] = useState<EntrepriseId[]>(props.selectedEntities ?? []) watch( () => props.selectedEntities, diff --git a/packages/ui/src/components/etape/date-type-edit.tsx b/packages/ui/src/components/etape/date-type-edit.tsx index 8daa8ea3d81e1a7f01343ae56717f84cd277bbd7..55140a600b39b07ec10561f6fd2933cfd53750b5 100644 --- a/packages/ui/src/components/etape/date-type-edit.tsx +++ b/packages/ui/src/components/etape/date-type-edit.tsx @@ -2,7 +2,7 @@ import { useState } from '@/utils/vue-tsx-utils' import { CaminoDate } from 'camino-common/src/date' import { EtapeId } from 'camino-common/src/etape' import { EtapeTypeId } from 'camino-common/src/static/etapesTypes' -import { watch, DeepReadonly, defineComponent } from 'vue' +import { watch, defineComponent } from 'vue' import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools' import { TypeEdit } from './type-edit' import { DemarcheId } from 'camino-common/src/demarche' @@ -10,12 +10,12 @@ import { ApiClient } from '../../api/api-client' import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts' import { DsfrInput } from '../_ui/dsfr-input' -export type EtapeDateTypeEdit = DeepReadonly<{ +export type EtapeDateTypeEdit = { statutId: EtapeStatutId | null typeId: EtapeTypeId | null id: EtapeId | null date: CaminoDate | null -}> +} export interface Props { etape: EtapeDateTypeEdit diff --git a/packages/ui/src/components/etape/entreprises-documents-edit.tsx b/packages/ui/src/components/etape/entreprises-documents-edit.tsx index 7a20f0a9db043d074891aea0784274ede6da5dda..88b3dd486103904b9284980168762d2f05bbd6de 100644 --- a/packages/ui/src/components/etape/entreprises-documents-edit.tsx +++ b/packages/ui/src/components/etape/entreprises-documents-edit.tsx @@ -1,5 +1,5 @@ import { dateFormat } from 'camino-common/src/date' -import { DeepReadonly, FunctionalComponent, computed, defineComponent, onMounted, ref, watch } from 'vue' +import { FunctionalComponent, computed, defineComponent, onMounted, ref, watch } from 'vue' import { EntrepriseDocument, EntrepriseDocumentId, EntrepriseId, entrepriseDocumentIdValidator, isEntrepriseId } from 'camino-common/src/entreprise' import { DocumentsTypes, EntrepriseDocumentType, EntrepriseDocumentTypeId } from 'camino-common/src/static/documentsTypes' import { getEntries, getEntriesHardcore, getKeys, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, map, stringArrayEquals } from 'camino-common/src/typescript-tools' @@ -26,7 +26,7 @@ interface Props { etapeTypeId: EtapeTypeId } completeUpdate: (etapeEntrepriseDocuments: SelectedEntrepriseDocument[]) => void - entreprises: DeepReadonly<Entreprise[]> + entreprises: Entreprise[] etapeId: EtapeId | null apiClient: Pick<ApiClient, 'creerEntrepriseDocument' | 'getEntrepriseDocuments' | 'getEtapeEntrepriseDocuments' | 'uploadTempDocument'> } diff --git a/packages/ui/src/components/etape/etape-api-client.ts b/packages/ui/src/components/etape/etape-api-client.ts index 7c41ac99653d234f20de8319ddd644f3915ebccb..5f68e4a728bcaf9452db01a408c1affb9d49e8b0 100644 --- a/packages/ui/src/components/etape/etape-api-client.ts +++ b/packages/ui/src/components/etape/etape-api-client.ts @@ -11,7 +11,7 @@ import { etapeTypeIdValidator } from 'camino-common/src/static/etapesTypes' import { geoSystemeIdValidator } from 'camino-common/src/static/geoSystemes' import { substanceLegaleIdValidator } from 'camino-common/src/static/substancesLegales' import { GetDemarcheByIdOrSlug } from 'camino-common/src/titres' -import { DeepReadonly, Nullable } from 'camino-common/src/typescript-tools' +import { Nullable } from 'camino-common/src/typescript-tools' import { CaminoError, nullToDefault } from 'camino-common/src/zod-tools' import gql from 'graphql-tag' import { DistributiveOmit } from 'maplibre-gl' @@ -83,11 +83,11 @@ export interface EtapeApiClient { deleteEtape: (titreEtapeId: EtapeId) => Promise<void> deposeEtape: (titreEtapeId: EtapeId) => Promise<void> getEtapeDocumentsByEtapeId: (etapeId: EtapeId) => Promise<GetEtapeDocumentsByEtapeId> - getEtapeHeritagePotentiel: (etape: DeepReadonly<Pick<CoreEtapeCreationOrModification, 'id' | 'date' | 'typeId'>>, titreDemarcheId: DemarcheId) => Promise<DeepReadonly<GetEtapeHeritagePotentiel>> + getEtapeHeritagePotentiel: (etape: Pick<CoreEtapeCreationOrModification, 'id' | 'date' | 'typeId'>, titreDemarcheId: DemarcheId) => Promise<GetEtapeHeritagePotentiel> getEtapeAvisByEtapeId: (etapeId: EtapeId) => Promise<GetEtapeAvisByEtapeId> - getEtape: (etapeIdOrSlug: EtapeIdOrSlug) => Promise<DeepReadonly<{ etape: FlattenEtape; demarche: GetDemarcheByIdOrSlug }>> - etapeCreer: (etape: DeepReadonly<RestEtapeCreation>) => Promise<CaminoError<string> | { id: EtapeId }> - etapeModifier: (etape: DeepReadonly<RestEtapeModification>) => Promise<CaminoError<string> | { id: EtapeId }> + getEtape: (etapeIdOrSlug: EtapeIdOrSlug) => Promise<{ etape: FlattenEtape; demarche: GetDemarcheByIdOrSlug }> + etapeCreer: (etape: RestEtapeCreation) => Promise<CaminoError<string> | { id: EtapeId }> + etapeModifier: (etape: RestEtapeModification) => Promise<CaminoError<string> | { id: EtapeId }> } export const etapeApiClient: EtapeApiClient = { @@ -189,7 +189,7 @@ export const etapeApiClient: EtapeApiClient = { }) // TODO 2024-06-02 on a du code métier dans notre api, on fusionne étape avec l'héritage - const heritageData: DeepReadonly<z.infer<typeof heritageValidator>> = heritageValidator.parse(data) + const heritageData: z.infer<typeof heritageValidator> = heritageValidator.parse(data) return heritageData }, diff --git a/packages/ui/src/components/etape/etape-avis-edit.tsx b/packages/ui/src/components/etape/etape-avis-edit.tsx index a4504c736d0cd7e6295ed6c5e923fdad8c17bca1..796beef8719330f6a7d40e59af95896081b00f5e 100644 --- a/packages/ui/src/components/etape/etape-avis-edit.tsx +++ b/packages/ui/src/components/etape/etape-avis-edit.tsx @@ -3,7 +3,7 @@ import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes' import { EtapeTypeId } from 'camino-common/src/static/etapesTypes' import { TitreTypeId } from 'camino-common/src/static/titresTypes' import { ApiClient } from '../../api/api-client' -import { DeepReadonly, FunctionalComponent, computed, defineComponent, onMounted, ref, watch } from 'vue' +import { FunctionalComponent, computed, defineComponent, onMounted, ref, watch } from 'vue' import { isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, NonEmptyArray } from 'camino-common/src/typescript-tools' import { LoadingElement } from '../_ui/functional-loader' import { AsyncData } from '../../api/client-rest' @@ -28,7 +28,7 @@ interface Props { } onChange: (etapeAvis: (EtapeAvis | TempEtapeAvis)[]) => void etapeId: EtapeId | null - communeIds: DeepReadonly<CommuneId[]> + communeIds: CommuneId[] apiClient: Pick<ApiClient, 'uploadTempDocument' | 'getEtapeAvisByEtapeId'> user: User } diff --git a/packages/ui/src/components/etape/etape-documents-edit.tsx b/packages/ui/src/components/etape/etape-documents-edit.tsx index 7ffad82092316a47d6da3f1eea4ac77e414393f0..38b06b6cab2d2931a56469a9d204c700189b64d6 100644 --- a/packages/ui/src/components/etape/etape-documents-edit.tsx +++ b/packages/ui/src/components/etape/etape-documents-edit.tsx @@ -3,7 +3,7 @@ import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes' import { EtapeTypeId } from 'camino-common/src/static/etapesTypes' import { TitreTypeId } from 'camino-common/src/static/titresTypes' import { ApiClient } from '../../api/api-client' -import { DeepReadonly, FunctionalComponent, computed, defineComponent, onMounted, ref, watch } from 'vue' +import { FunctionalComponent, computed, defineComponent, onMounted, ref, watch } from 'vue' import { SDOMZoneId } from 'camino-common/src/static/sdom' import { isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, NonEmptyArray } from 'camino-common/src/typescript-tools' import { AutreDocumentType, AutreDocumentTypeId, DocumentType, DocumentTypeId, DocumentsTypes } from 'camino-common/src/static/documentsTypes' @@ -26,11 +26,11 @@ interface Props { firstEtapeDate: FirstEtapeDate } isBrouillon: EtapeBrouillon - sdomZoneIds: DeepReadonly<SDOMZoneId[]> + sdomZoneIds: SDOMZoneId[] completeUpdate: (etapeDocuments: (EtapeDocument | TempEtapeDocument)[]) => void etapeId: EtapeId | null apiClient: Pick<ApiClient, 'uploadTempDocument' | 'getEtapeDocumentsByEtapeId'> - contenu: DeepReadonly<{ arm?: { mecanise?: { value: boolean } } }> + contenu: { arm?: { mecanise?: { value: boolean } } } user: User } diff --git a/packages/ui/src/components/etape/etape-edit-form.tsx b/packages/ui/src/components/etape/etape-edit-form.tsx index d0c7f797685013930868adef15c854ef506fe8ce..a571af63969d5b1ac7ea1f15371e969b61ade364 100644 --- a/packages/ui/src/components/etape/etape-edit-form.tsx +++ b/packages/ui/src/components/etape/etape-edit-form.tsx @@ -1,4 +1,4 @@ -import { DeepReadonly, computed, defineComponent, onMounted, ref } from 'vue' +import { computed, defineComponent, onMounted, ref } from 'vue' import { Bloc } from './bloc' import { EtapeFondamentaleEdit, FondamentalesEdit } from './fondamentales-edit' import { PerimetreEdit } from './perimetre-edit' @@ -53,14 +53,14 @@ import { DsfrInputCheckbox } from '../_ui/dsfr-input-checkbox' import { CaminoError } from 'camino-common/src/zod-tools' export type Props = { - etape: DeepReadonly<Pick<Nullable<FlattenEtape>, 'id' | 'date' | 'typeId' | 'statutId' | 'slug'> & Omit<FlattenEtape, 'date' | 'typeId' | 'statutId' | 'id' | 'slug'>> + etape: Pick<Nullable<FlattenEtape>, 'id' | 'date' | 'typeId' | 'statutId' | 'slug'> & Omit<FlattenEtape, 'date' | 'typeId' | 'statutId' | 'id' | 'slug'> demarcheId: DemarcheId demarcheTypeId: DemarcheTypeId titreTypeId: TitreTypeId titreSlug: TitreSlug user: User - entreprises: DeepReadonly<Entreprise[]> - perimetre: DeepReadonly<PerimetreInformations> + entreprises: Entreprise[] + perimetre: PerimetreInformations initTab?: 'points' | 'carte' goToDemarche: (demarcheId: DemarcheId) => void firstEtapeDate: FirstEtapeDate | null @@ -83,25 +83,25 @@ export type Props = { > } -type EtapeEditFormDocuments = DeepReadonly<{ +type EtapeEditFormDocuments = { etapeDocuments: (EtapeDocument | TempEtapeDocument)[] entrepriseDocuments: SelectedEntrepriseDocument[] etapeAvis: (EtapeAvis | TempEtapeAvis)[] -}> +} const mergeFlattenEtapeWithNewHeritage = ( - etape: DeepReadonly<CoreEtapeCreationOrModification>, + etape: CoreEtapeCreationOrModification, titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, - heritageData: DeepReadonly<GetEtapeHeritagePotentiel> -): DeepReadonly<CoreEtapeCreationOrModification> => { + heritageData: GetEtapeHeritagePotentiel +): CoreEtapeCreationOrModification => { const sections = getSections(titreTypeId, demarcheTypeId, etape.typeId) - const flattenEtape: DeepReadonly<CoreEtapeCreationOrModification> = { + const flattenEtape: CoreEtapeCreationOrModification = { ...etape, - contenu: sections.reduce<DeepReadonly<FlattenEtape['contenu']>>((accSection, section) => { - const newSection = section.elements.reduce<DeepReadonly<FlattenEtape['contenu'][string]>>((accElement, element) => { + contenu: sections.reduce<FlattenEtape['contenu']>((accSection, section) => { + const newSection = section.elements.reduce<FlattenEtape['contenu'][string]>((accElement, element) => { const elementHeritage = heritageData.heritageContenu[section.id]?.[element.id] ?? { actif: false, etape: null } - const currentHeritage: DeepReadonly<FlattenedContenuElement> = etape.contenu[section.id]?.[element.id] ?? { value: null, heritee: true, etapeHeritee: null } + const currentHeritage: FlattenedContenuElement = etape.contenu[section.id]?.[element.id] ?? { value: null, heritee: true, etapeHeritee: null } // L'héritage ne peut pas être activé si le champ est obligatoire et que la valeur du champ dans l'étape héritable est null const canHaveHeritage: boolean = element.optionnel || isNotNullNorUndefined(elementHeritage.etape?.contenu?.[section.id]?.[element.id]) @@ -217,7 +217,7 @@ const mergeFlattenEtapeWithNewHeritage = ( } export const EtapeEditForm = defineComponent<Props>(props => { const [etape, setEtape] = useState<AsyncData<CoreEtapeCreationOrModification | null>>({ status: 'LOADED', value: null }) - const [perimetreInfos, setPerimetreInfos] = useState<DeepReadonly<Omit<PerimetreInformations, 'communes'>>>(props.perimetre) + const [perimetreInfos, setPerimetreInfos] = useState<Omit<PerimetreInformations, 'communes'>>(props.perimetre) const [documents, setDocuments] = useState<EtapeEditFormDocuments>({ etapeDocuments: [], @@ -258,7 +258,7 @@ export const EtapeEditForm = defineComponent<Props>(props => { } } - const setEtapeAndDocument = (etape: DeepReadonly<CoreEtapeCreationOrModification>, documents: EtapeEditFormDocuments) => { + const setEtapeAndDocument = (etape: CoreEtapeCreationOrModification, documents: EtapeEditFormDocuments) => { setEtape({ status: 'LOADED', value: etape }) setDocuments(documents) } @@ -361,10 +361,10 @@ export const EtapeEditForm = defineComponent<Props>(props => { titulaires: { actif: etapeValue.titulaires.heritee }, amodiataires: { actif: etapeValue.amodiataires.heritee }, }, - contenu: Object.keys(etapeValue.contenu).reduce<DeepReadonly<RestEtapeCreation['contenu']>>((sectionsAcc, section) => { + contenu: Object.keys(etapeValue.contenu).reduce<RestEtapeCreation['contenu']>((sectionsAcc, section) => { sectionsAcc = { ...sectionsAcc, - [section]: Object.keys(etapeValue.contenu[section] ?? {}).reduce<DeepReadonly<RestEtapeCreation['contenu'][string]>>((elementsAcc, element) => { + [section]: Object.keys(etapeValue.contenu[section] ?? {}).reduce<RestEtapeCreation['contenu'][string]>((elementsAcc, element) => { elementsAcc = { ...elementsAcc, [element]: etapeValue.contenu[section]?.[element]?.value } return elementsAcc @@ -373,10 +373,10 @@ export const EtapeEditForm = defineComponent<Props>(props => { return sectionsAcc }, {}), - heritageContenu: Object.keys(etapeValue.contenu).reduce<DeepReadonly<RestEtapeCreation['heritageContenu']>>((sectionsAcc, section) => { + heritageContenu: Object.keys(etapeValue.contenu).reduce<RestEtapeCreation['heritageContenu']>((sectionsAcc, section) => { return { ...sectionsAcc, - [section]: Object.keys(etapeValue.contenu[section] ?? {}).reduce<DeepReadonly<RestEtapeCreation['heritageContenu'][string]>>((elementsAcc, element) => { + [section]: Object.keys(etapeValue.contenu[section] ?? {}).reduce<RestEtapeCreation['heritageContenu'][string]>((elementsAcc, element) => { return { ...elementsAcc, [element]: { actif: etapeValue.contenu[section]?.[element]?.heritee ?? false } } }, {}), } @@ -489,10 +489,10 @@ export const EtapeEditForm = defineComponent<Props>(props => { const EtapeEditFormInternal = defineComponent< { - etape: DeepReadonly<CoreEtapeCreationOrModification> + etape: CoreEtapeCreationOrModification documents: EtapeEditFormDocuments - setEtape: (etape: DeepReadonly<CoreEtapeCreationOrModification>, documents: EtapeEditFormDocuments) => void - alertesUpdate: (alertes: Omit<DeepReadonly<PerimetreInformations>, 'communes'>) => void + setEtape: (etape: CoreEtapeCreationOrModification, documents: EtapeEditFormDocuments) => void + alertesUpdate: (alertes: Omit<PerimetreInformations, 'communes'>) => void } & Omit<Props, 'etape'> >(props => { const documentsCompleteUpdate = (etapeDocuments: (EtapeDocument | TempEtapeDocument)[]) => { @@ -513,7 +513,7 @@ const EtapeEditFormInternal = defineComponent< }) } - const entrepriseDocumentsCompleteUpdate = (entrepriseDocuments: DeepReadonly<SelectedEntrepriseDocument[]>) => { + const entrepriseDocumentsCompleteUpdate = (entrepriseDocuments: SelectedEntrepriseDocument[]) => { props.setEtape(props.etape, { ...props.documents, entrepriseDocuments }) } @@ -541,7 +541,7 @@ const EtapeEditFormInternal = defineComponent< props.alertesUpdate({ superposition_alertes: perimetreInfos.superposition_alertes, sdomZoneIds: perimetreInfos.sdomZoneIds }) } - const onEtapePerimetreHeritageChange = (perimetre: DeepReadonly<FlattenEtape['perimetre']>) => { + const onEtapePerimetreHeritageChange = (perimetre: FlattenEtape['perimetre']) => { props.setEtape( { ...props.etape, @@ -568,11 +568,11 @@ const EtapeEditFormInternal = defineComponent< const onUpdateNotes = (notes: string) => { props.setEtape({ ...props.etape, note: { is_avertissement: props.etape.note.is_avertissement, valeur: notes } }, props.documents) } - const onUpdateNoteAvertissement = (isAvertissement: DeepReadonly<boolean>) => { + const onUpdateNoteAvertissement = (isAvertissement: boolean) => { props.setEtape({ ...props.etape, note: { valeur: props.etape.note.valeur, is_avertissement: isAvertissement } }, props.documents) } - const fondamentalesCompleteUpdate = (etapeFondamentale: DeepReadonly<EtapeFondamentaleEdit>) => { + const fondamentalesCompleteUpdate = (etapeFondamentale: EtapeFondamentaleEdit) => { props.setEtape({ ...props.etape, ...etapeFondamentale }, props.documents) } diff --git a/packages/ui/src/components/etape/fondamentales-edit.tsx b/packages/ui/src/components/etape/fondamentales-edit.tsx index f9ba8c1f0625e2275df6f890f0cfd10e33e69d4f..9875dcaadc5277ff01e5bfa670477c7c2208f234 100644 --- a/packages/ui/src/components/etape/fondamentales-edit.tsx +++ b/packages/ui/src/components/etape/fondamentales-edit.tsx @@ -8,7 +8,7 @@ import { canEditAmodiataires, canEditTitulaires, canEditDuree, canEditDates, Inp import { DomaineId } from 'camino-common/src/static/domaines' import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes' import { getDomaineId, TitreTypeId } from 'camino-common/src/static/titresTypes' -import { computed, ref, DeepReadonly, defineComponent } from 'vue' +import { computed, ref, defineComponent } from 'vue' import { Entreprise, EntrepriseId } from 'camino-common/src/entreprise' import { User } from 'camino-common/src/roles' import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' @@ -18,11 +18,11 @@ import { ZERO_KM2 } from 'camino-common/src/number' export type EtapeFondamentaleEdit = Pick<FlattenEtape, 'typeId' | 'dateDebut' | 'dateFin' | 'duree' | 'titulaires' | 'amodiataires' | 'substances' | 'perimetre' | 'date' | 'titreDemarcheId'> interface Props { - etape: DeepReadonly<EtapeFondamentaleEdit> + etape: EtapeFondamentaleEdit demarcheTypeId: DemarcheTypeId titreTypeId: TitreTypeId user: User - entreprises: DeepReadonly<Entreprise[]> + entreprises: Entreprise[] completeUpdate: (etape: Props['etape']) => void firstEtapeDate: FirstEtapeDate } @@ -47,7 +47,7 @@ export const FondamentalesEdit = defineComponent<Props>(props => { const dateFinChanged = (dateFin: CaminoDate | null) => { updateEtape({ dateFin: { ...editedEtape.value.dateFin, value: dateFin } }) } - const substancesChanged = (substances: DeepReadonly<FlattenEtape['substances']>) => { + const substancesChanged = (substances: FlattenEtape['substances']) => { updateEtape({ substances }) } const updateDureeHeritage = (duree: FlattenEtape['duree']) => { @@ -59,10 +59,10 @@ export const FondamentalesEdit = defineComponent<Props>(props => { const updateDateFinHeritage = (dateFin: FlattenEtape['dateFin']) => { updateEtape({ dateFin }) } - const updateTitulairesHeritage = (titulaires: DeepReadonly<FlattenEtape['titulaires']>) => { + const updateTitulairesHeritage = (titulaires: FlattenEtape['titulaires']) => { updateEtape({ titulaires }) } - const updateAmodiatairesHeritage = (amodiataires: DeepReadonly<FlattenEtape['amodiataires']>) => { + const updateAmodiatairesHeritage = (amodiataires: FlattenEtape['amodiataires']) => { updateEtape({ amodiataires }) } @@ -100,11 +100,11 @@ export const FondamentalesEdit = defineComponent<Props>(props => { const domaineId = computed<DomaineId>(() => getDomaineId(props.titreTypeId)) - const titulairesUpdate = (titulaireIds: DeepReadonly<EntrepriseId[]>) => { + const titulairesUpdate = (titulaireIds: EntrepriseId[]) => { updateEtape({ titulaires: { ...editedEtape.value.titulaires, value: titulaireIds } }) } - const amodiatairesUpdate = (amodiataireIds: DeepReadonly<EntrepriseId[]>) => { + const amodiatairesUpdate = (amodiataireIds: EntrepriseId[]) => { updateEtape({ amodiataires: { ...editedEtape.value.amodiataires, value: amodiataireIds } }) } diff --git a/packages/ui/src/components/etape/heritage-edit.tsx b/packages/ui/src/components/etape/heritage-edit.tsx index e7d1c59da3be8fb7abcb695dea67fa5266d34ac5..306e14a4be8fbf6371ecafab85077c335cbeff3f 100644 --- a/packages/ui/src/components/etape/heritage-edit.tsx +++ b/packages/ui/src/components/etape/heritage-edit.tsx @@ -1,6 +1,6 @@ import { dateFormat } from 'camino-common/src/date' import { HTMLAttributes } from 'vue' -import { DeepReadonly, isNotNullNorUndefined } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools' import { DsfrToggle } from '../_ui/dsfr-toggle' import { EtapesTypes } from 'camino-common/src/static/etapesTypes' import { capitalize } from 'camino-common/src/strings' @@ -19,7 +19,7 @@ type HeritagePossible = | FlattenEtape['substances'] | FlattenedContenuElement -type Props<T extends DeepReadonly<HeritagePossible>> = { +type Props<T extends HeritagePossible> = { prop: T write: () => JSX.Element read: (heritagePropEtape?: NoInfer<T>['etapeHeritee']) => JSX.Element @@ -29,7 +29,7 @@ type Props<T extends DeepReadonly<HeritagePossible>> = { updateHeritage: (update: NoInfer<T>) => void } -export const HeritageEdit = <T extends DeepReadonly<HeritagePossible>>(props: Props<T>): JSX.Element => { +export const HeritageEdit = <T extends HeritagePossible>(props: Props<T>): JSX.Element => { const updateHeritage = () => { const etapeHeritee = props.prop.etapeHeritee const newHeritage = !props.prop.heritee diff --git a/packages/ui/src/components/etape/perimetre-edit.tsx b/packages/ui/src/components/etape/perimetre-edit.tsx index 02d59dd2caf5679e67df8c7a6af1e7569ed21c93..35023cf2c116b89b2296344b5915a2218d11728a 100644 --- a/packages/ui/src/components/etape/perimetre-edit.tsx +++ b/packages/ui/src/components/etape/perimetre-edit.tsx @@ -1,6 +1,6 @@ import { HeritageEdit } from './heritage-edit' import { PerimetreImportPopup } from './perimetre-import-popup' -import { DeepReadonly, FunctionalComponent, HTMLAttributes, defineComponent, ref } from 'vue' +import { FunctionalComponent, HTMLAttributes, defineComponent, ref } from 'vue' import { DsfrButton } from '../_ui/dsfr-button' import { ApiClient } from '@/api/api-client' import { FeatureCollectionForages, FeatureCollectionPoints, GeojsonInformations } from 'camino-common/src/perimetre' @@ -20,7 +20,7 @@ import { FirstEtapeDate } from 'camino-common/src/date' export interface Props { apiClient: Pick<ApiClient, 'uploadTempDocument' | 'geojsonImport' | 'geojsonPointsImport' | 'geojsonForagesImport'> - etape: DeepReadonly<Pick<CoreEtapeCreationOrModification, 'perimetre' | 'date' | 'typeId' | 'titreDemarcheId'>> + etape: Pick<CoreEtapeCreationOrModification, 'perimetre' | 'date' | 'typeId' | 'titreDemarcheId'> titreTypeId: TitreTypeId demarcheTypeId: DemarcheTypeId titreSlug: TitreSlug diff --git a/packages/ui/src/components/etape/section-element-with-value-edit.tsx b/packages/ui/src/components/etape/section-element-with-value-edit.tsx index 8127cc90ffbef94d5f10d22016b476fb74d3467d..296e856d5ff0182c07fe58d372807446af51db28 100644 --- a/packages/ui/src/components/etape/section-element-with-value-edit.tsx +++ b/packages/ui/src/components/etape/section-element-with-value-edit.tsx @@ -1,4 +1,4 @@ -import { DeepReadonly, FunctionalComponent } from 'vue' +import { FunctionalComponent } from 'vue' import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' import { ElementWithValue } from 'camino-common/src/sections' import { HeritageEdit } from './heritage-edit' @@ -9,8 +9,8 @@ import { CaminoDate } from 'camino-common/src/date' type Props = { sectionId: string - elementWithValue: DeepReadonly<ElementWithValue> - elementHeritage: DeepReadonly<FlattenedContenuElement> + elementWithValue: ElementWithValue + elementHeritage: FlattenedContenuElement updateElement: (etape: Props['elementHeritage']) => void etapeDate: CaminoDate } @@ -20,7 +20,7 @@ export const SectionElementWithValueEdit: FunctionalComponent<Props> = props => return <SectionElementEdit element={props.elementWithValue} onValueChange={updateValue} sectionId={props.sectionId} etapeDate={props.etapeDate} /> } - const updateValue = (element: DeepReadonly<ElementWithValue>) => { + const updateValue = (element: ElementWithValue) => { props.updateElement({ ...props.elementHeritage, value: element.value }) } const updateHeritage = (heritage: Props['elementHeritage']) => { diff --git a/packages/ui/src/components/etape/sections-edit.tsx b/packages/ui/src/components/etape/sections-edit.tsx index cddc77eb5e1c8b022fd53814d6b0074bf3de86fa..f610aa6b979c2b9d18d2aff3479471387f065b5c 100644 --- a/packages/ui/src/components/etape/sections-edit.tsx +++ b/packages/ui/src/components/etape/sections-edit.tsx @@ -1,4 +1,4 @@ -import { DeepReadonly, computed, defineComponent } from 'vue' +import { computed, defineComponent } from 'vue' import { TitreTypeId } from 'camino-common/src/static/titresTypes' import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes' import { getSections, getSectionsWithValue } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' @@ -8,18 +8,18 @@ import { SectionWithValue } from 'camino-common/src/sections' import { SectionElementWithValueEdit } from './section-element-with-value-edit' import { FlattenedContenuElement, FlattenEtape } from 'camino-common/src/etape-form' -export type SectionsEditEtape = DeepReadonly<Pick<FlattenEtape, 'typeId' | 'contenu' | 'date'>> +export type SectionsEditEtape = Pick<FlattenEtape, 'typeId' | 'contenu' | 'date'> type Props = { titreTypeId: TitreTypeId demarcheTypeId: DemarcheTypeId - etape: DeepReadonly<SectionsEditEtape> + etape: SectionsEditEtape completeUpdate: (etape: Props['etape']) => void } export const SectionsEdit = defineComponent<Props>(props => { const [editedEtape, setEditedEtape] = useState(props.etape) - const updateElement = (sectionId: string, elementId: string) => (element: DeepReadonly<FlattenedContenuElement>) => { + const updateElement = (sectionId: string, elementId: string) => (element: FlattenedContenuElement) => { updateEtape({ contenu: { ...editedEtape.value.contenu, [sectionId]: { ...editedEtape.value.contenu[sectionId], [elementId]: element } } }) } @@ -31,7 +31,7 @@ export const SectionsEdit = defineComponent<Props>(props => { const sections = computed(() => { return getSections(props.titreTypeId, props.demarcheTypeId, props.etape.typeId) }) - const sectionsWithValue = computed<DeepReadonly<SectionWithValue[]>>(() => { + const sectionsWithValue = computed<SectionWithValue[]>(() => { if (isNotNullNorUndefined(editedEtape.value.contenu)) { return getSectionsWithValue(sections.value, editedEtape.value.contenu) } diff --git a/packages/ui/src/components/etape/substances-edit.tsx b/packages/ui/src/components/etape/substances-edit.tsx index e4d392a20cc2667e82b1cb06f35385bc057bdbfe..cf6eb6ddd6d2ebe0b27d39e254ba844596cfdb24 100644 --- a/packages/ui/src/components/etape/substances-edit.tsx +++ b/packages/ui/src/components/etape/substances-edit.tsx @@ -1,6 +1,6 @@ import { useState } from '@/utils/vue-tsx-utils' import { SubstancesLegales, SubstancesLegale, SubstanceLegaleId } from 'camino-common/src/static/substancesLegales' -import { DeepReadonly, computed, defineComponent, watch } from 'vue' +import { computed, defineComponent, watch } from 'vue' import { HeritageEdit } from '@/components/etape/heritage-edit' import { DomaineId } from 'camino-common/src/static/domaines' import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools' @@ -11,20 +11,18 @@ import { capitalize } from 'camino-common/src/strings' import { FlattenEtape } from 'camino-common/src/etape-form' type Props = { - substances: DeepReadonly<FlattenEtape['substances']> + substances: FlattenEtape['substances'] domaineId: DomaineId - updateSubstances: (substances: DeepReadonly<FlattenEtape['substances']>) => void + updateSubstances: (substances: FlattenEtape['substances']) => void } type SubstancesEditables = Pick<FlattenEtape['substances'], 'heritee' | 'etapeHeritee'> & { value: (SubstanceLegaleId | undefined)[] } export const SubstancesEdit = defineComponent<Props>(props => { - const [editedSubstances, setEditedSubstances] = useState<DeepReadonly<SubstancesEditables>>( - isNullOrUndefinedOrEmpty(props.substances.value) ? { ...props.substances, value: [undefined] } : props.substances - ) + const [editedSubstances, setEditedSubstances] = useState<SubstancesEditables>(isNullOrUndefinedOrEmpty(props.substances.value) ? { ...props.substances, value: [undefined] } : props.substances) const substancesLength = computed<number>(() => editedSubstances.value.value.filter(isNotNullNorUndefined).length) - const updateHeritage = (substanceHeritageValue: DeepReadonly<FlattenEtape['substances']>) => { + const updateHeritage = (substanceHeritageValue: FlattenEtape['substances']) => { setEditedSubstances(substanceHeritageValue) } diff --git a/packages/ui/src/components/etape/type-edit.tsx b/packages/ui/src/components/etape/type-edit.tsx index e67f6f30d780dc5b45a88511a45b47fce76a09d1..f83a194d9d3ccf75dd3ee358696ba4246203116f 100644 --- a/packages/ui/src/components/etape/type-edit.tsx +++ b/packages/ui/src/components/etape/type-edit.tsx @@ -7,7 +7,7 @@ import { CaminoDate } from 'camino-common/src/date' import { EtapeId, EtapeTypeEtapeStatutWithMainStep } from 'camino-common/src/etape' import { AsyncData } from '@/api/client-rest' import { LoadingElement } from '../_ui/functional-loader' -import { DeepReadonly, NonEmptyArray, getKeys, isNonEmptyArray, isNotNullNorUndefined, isNullOrUndefined, isNullOrUndefinedOrEmpty, map, onlyUnique } from 'camino-common/src/typescript-tools' +import { NonEmptyArray, getKeys, isNonEmptyArray, isNotNullNorUndefined, isNullOrUndefined, isNullOrUndefinedOrEmpty, map, onlyUnique } from 'camino-common/src/typescript-tools' import { Alert } from '../_ui/alert' import { TypeAheadSingle } from '../_ui/typeahead-single' import { DsfrSelect, Item } from '../_ui/dsfr-select' @@ -15,12 +15,12 @@ import type { JSX } from 'vue/jsx-runtime' import { capitalize } from 'camino-common/src/strings' type Props = { - etape: DeepReadonly<{ + etape: { statutId: EtapeStatutId | null typeId: EtapeTypeId | null id?: EtapeId | null date: CaminoDate - }> + } demarcheId: DemarcheId apiClient: Pick<EtapeApiClient, 'getEtapesTypesEtapesStatuts'> onEtapeChange: (statutId: EtapeStatutId | null, typeId: EtapeTypeId | null) => void @@ -33,7 +33,7 @@ interface SelectStatutProps { } const SelectStatut: FunctionalComponent<SelectStatutProps> = (props: SelectStatutProps): JSX.Element | null => { - const items: NonEmptyArray<Item<EtapeStatutId>> = map(props.statutIds, statutId => ({ id: statutId, label: EtapesStatuts[statutId].nom, disabled: props.statutId === statutId })) + const items: Readonly<NonEmptyArray<Item<EtapeStatutId>>> = map(props.statutIds, statutId => ({ id: statutId, label: EtapesStatuts[statutId].nom, disabled: props.statutId === statutId })) const initialValue = isNotNullNorUndefined(props.statutId) ? props.statutId : props.statutIds.length === 1 ? props.statutIds[0] : null diff --git a/packages/ui/src/components/page/quick-access-titre.tsx b/packages/ui/src/components/page/quick-access-titre.tsx index 0de316ce7a8608a9368b786baa16a9055230d961..c763de03bbcfb04a6854b1012d3f9ff2913f9c97 100644 --- a/packages/ui/src/components/page/quick-access-titre.tsx +++ b/packages/ui/src/components/page/quick-access-titre.tsx @@ -4,7 +4,7 @@ import { getDomaineId, getTitreTypeType } from 'camino-common/src/static/titresT import { titresRechercherByReferences } from '@/api/titres' import { createDebounce } from '@/utils/debounce' import { useRouter } from 'vue-router' -import { ref, FunctionalComponent, DeepReadonly, defineComponent } from 'vue' +import { ref, FunctionalComponent, defineComponent } from 'vue' import { titreApiClient, TitreForTitresRerchercherByNom } from '../titre/titre-api-client' import { capitalize } from 'camino-common/src/strings' import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools' @@ -29,7 +29,7 @@ export const QuickAccessTitre = defineComponent<{ id: string; onSelectTitre: () titres.value.splice(0, titres.value.length, ...searchTitres.elements) } - const onSelectedTitre = (titre: DeepReadonly<TitreForTitresRerchercherByNom> | undefined) => { + const onSelectedTitre = (titre: TitreForTitresRerchercherByNom | undefined) => { if (titre) { router.push({ name: 'titre', params: { id: titre.id } }) props.onSelectTitre() @@ -45,12 +45,12 @@ QuickAccessTitre.props = ['id', 'onSelectTitre'] interface Props { id?: string titres: TitreForTitresRerchercherByNom[] - onSelectedTitre: (titre: DeepReadonly<TitreForTitresRerchercherByNom> | undefined) => void + onSelectedTitre: (titre: TitreForTitresRerchercherByNom | undefined) => void alwaysOpen?: boolean onSearch: (searchTerm: string) => void } interface DisplayTitreProps { - titre: DeepReadonly<Pick<TitreForTitresRerchercherByNom, 'nom' | 'typeId' | 'demarches'>> + titre: Pick<TitreForTitresRerchercherByNom, 'nom' | 'typeId' | 'demarches'> } export const DisplayTitre: FunctionalComponent<DisplayTitreProps> = props => { let annee: CaminoAnnee | null = null @@ -73,12 +73,12 @@ export const DisplayTitre: FunctionalComponent<DisplayTitreProps> = props => { } export const PureQuickAccessTitre = defineComponent<Props>(props => { - const display = (titre: DeepReadonly<TitreForTitresRerchercherByNom>) => { + const display = (titre: TitreForTitresRerchercherByNom) => { return <DisplayTitre titre={titre} /> } const overrideItem = ref<TitreForTitresRerchercherByNom | null>(null) - const selectItem = (item: DeepReadonly<TitreForTitresRerchercherByNom> | undefined) => { + const selectItem = (item: TitreForTitresRerchercherByNom | undefined) => { overrideItem.value = null props.onSelectedTitre(item) } diff --git a/packages/ui/src/components/titre/demarche-api-client.ts b/packages/ui/src/components/titre/demarche-api-client.ts index 6b107e09cbddd96c9d150da7e9acca4c298db0ff..b872b245e09a45361762528d1a1258a0949cc9e0 100644 --- a/packages/ui/src/components/titre/demarche-api-client.ts +++ b/packages/ui/src/components/titre/demarche-api-client.ts @@ -13,7 +13,6 @@ import { EntrepriseId } from 'camino-common/src/entreprise' import { SubstanceLegaleId } from 'camino-common/src/static/substancesLegales' import { TitreTypeTypeId } from 'camino-common/src/static/titresTypesTypes' import { deleteWithJson, getWithJson, newGetWithJson, newPostWithJson } from '../../api/client-rest' -import { DeepReadonly } from 'vue' import { CaminoError } from 'camino-common/src/zod-tools' type InputDemarcheUpdation = DemarcheCreationInput & { @@ -54,9 +53,9 @@ export interface DemarcheApiClient { createDemarche: (demarche: DemarcheCreationInput) => Promise<DemarcheCreationOutput | CaminoError<string>> updateDemarche: (demarche: InputDemarcheUpdation) => Promise<DemarcheSlug> deleteDemarche: (demarcheId: DemarcheId) => Promise<void> - getDemarcheByIdOrSlug: (demarcheIdOrSlug: DemarcheIdOrSlug) => Promise<DeepReadonly<GetDemarcheByIdOrSlug>> - getDemarcheMiseEnConcurrence: (demarcheId: DemarcheId) => Promise<DeepReadonly<GetDemarcheMiseEnConcurrence[]> | CaminoError<string>> - getResultatMiseEnConcurrence: (demarcheId: DemarcheId) => Promise<DeepReadonly<GetResultatMiseEnConcurrence | CaminoError<string>>> + getDemarcheByIdOrSlug: (demarcheIdOrSlug: DemarcheIdOrSlug) => Promise<GetDemarcheByIdOrSlug> + getDemarcheMiseEnConcurrence: (demarcheId: DemarcheId) => Promise<GetDemarcheMiseEnConcurrence[] | CaminoError<string>> + getResultatMiseEnConcurrence: (demarcheId: DemarcheId) => Promise<GetResultatMiseEnConcurrence | CaminoError<string>> getDemarches: (params: GetDemarchesParams) => Promise<{ elements: GetDemarchesDemarche[]; total: number }> } diff --git a/packages/ui/src/components/titre/demarche-consentement.tsx b/packages/ui/src/components/titre/demarche-consentement.tsx index ace5e8362e0a0ddf9ceb4c33ec5fdc2ad4ba5b4b..863896ff3729e5d1a762cf4f251ac64e26a087ec 100644 --- a/packages/ui/src/components/titre/demarche-consentement.tsx +++ b/packages/ui/src/components/titre/demarche-consentement.tsx @@ -1,6 +1,6 @@ import { DemarcheConsentement, DemarcheEtape, DemarcheSlug } from 'camino-common/src/demarche' import { computed, defineComponent, FunctionalComponent } from 'vue' -import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined, PickDistributive } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNullOrUndefined, PickDistributive } from 'camino-common/src/typescript-tools' import { Alert } from '../_ui/alert' import { DsfrLink } from '../_ui/dsfr-button' import { ETAPE_TYPE_FOR_CONSENTEMENT_DATA, ETAPES_TYPES } from 'camino-common/src/static/etapesTypes' @@ -43,7 +43,7 @@ export const DemarchesConsentement = defineComponent<Props>(props => { // @ts-ignore waiting for https://github.com/vuejs/core/issues/7833 DemarchesConsentement.props = ['demarcheSlug', 'titre'] -const DemarchesConsentementLoaded: FunctionalComponent<{ demarches: DeepReadonly<DemarcheConsentement[]> }> = ({ demarches }) => { +const DemarchesConsentementLoaded: FunctionalComponent<{ demarches: DemarcheConsentement[] }> = ({ demarches }) => { return ( <> <span> Les titres suivants sont valides et concernent au moins une substance en commun avec cette demande :</span> diff --git a/packages/ui/src/components/titre/demarche-mise-en-concurrence.tsx b/packages/ui/src/components/titre/demarche-mise-en-concurrence.tsx index 450d5bb03bb3dac68550b31a38efd81d122e4b69..2a1abf3d73c1f3c640f9a14a321b941c81319327 100644 --- a/packages/ui/src/components/titre/demarche-mise-en-concurrence.tsx +++ b/packages/ui/src/components/titre/demarche-mise-en-concurrence.tsx @@ -3,7 +3,7 @@ import { AsyncData } from '@/api/client-rest' import { canHaveMiseEnConcurrence, demarcheEnregistrementDemandeDateFind, DemarcheEtape, DemarcheId, demarcheIdValidator, GetDemarcheMiseEnConcurrence } from 'camino-common/src/demarche' import { computed, defineComponent, FunctionalComponent, ref } from 'vue' import { LoadingElement } from '../_ui/functional-loader' -import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, PickDistributive } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, PickDistributive } from 'camino-common/src/typescript-tools' import { Alert } from '../_ui/alert' import { DsfrLink } from '../_ui/dsfr-button' import { ETAPE_TYPE_FOR_CONCURRENCY_DATA, ETAPES_TYPES } from 'camino-common/src/static/etapesTypes' @@ -23,7 +23,7 @@ export type Props = { hasTitresFrom: boolean | 'LOADING' } export const DemarcheMiseEnConcurrence = defineComponent<Props>(props => { - type AsyncDemarches = AsyncData<DeepReadonly<GetDemarcheMiseEnConcurrence[]>> + type AsyncDemarches = AsyncData<GetDemarcheMiseEnConcurrence[]> type Conf = null | { type: 'hasAlert'; demarches: AsyncDemarches; demarcheId: DemarcheId } | { type: 'mayHaveAlert'; demarches: AsyncDemarches; demarcheId: DemarcheId } const conf = ref<Conf>({ @@ -170,7 +170,7 @@ export const DemarcheMiseEnConcurrence = defineComponent<Props>(props => { // @ts-ignore waiting for https://github.com/vuejs/core/issues/7833 DemarcheMiseEnConcurrence.props = ['apiClient', 'titre', 'user', 'hasTitresFrom'] -const DemarcheMiseEnConcurrenceLoaded: FunctionalComponent<{ demarches: DeepReadonly<GetDemarcheMiseEnConcurrence[]> }> = ({ demarches }) => { +const DemarcheMiseEnConcurrenceLoaded: FunctionalComponent<{ demarches: GetDemarcheMiseEnConcurrence[] }> = ({ demarches }) => { return ( <> {demarches.length === 0 ? ( diff --git a/packages/ui/src/components/titre/resultat-mise-en-concurrence.tsx b/packages/ui/src/components/titre/resultat-mise-en-concurrence.tsx index 12416aeb4d32d2d2d7f7c1782b81ee9c231820ac..0e65ce7370ac31cdac8b89fbbece4ba7d93052a8 100644 --- a/packages/ui/src/components/titre/resultat-mise-en-concurrence.tsx +++ b/packages/ui/src/components/titre/resultat-mise-en-concurrence.tsx @@ -3,7 +3,7 @@ import { computed, defineComponent, watch } from 'vue' import { DsfrInputRadio } from '../_ui/dsfr-input-radio' import { useState } from '@/utils/vue-tsx-utils' import { DsfrButton, DsfrLink } from '../_ui/dsfr-button' -import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools' import { DsfrPerimetre, TabId } from '../_common/dsfr-perimetre' import { DsfrInput } from '../_ui/dsfr-input' import { Entreprise, EntrepriseId } from 'camino-common/src/entreprise' @@ -26,7 +26,7 @@ export type Props = { entreprises: Entreprise[] initDate?: CaminoDate initDecision?: 'acc' | 'rej' - pivot: DeepReadonly<GetResultatMiseEnConcurrence> + pivot: GetResultatMiseEnConcurrence } export const ResultatMiseEnConcurrence = defineComponent<Props>(props => { @@ -40,19 +40,17 @@ export const ResultatMiseEnConcurrence = defineComponent<Props>(props => { return acc }, {}) - const perimetre = computed< - DeepReadonly<{ - geojson4326_perimetre: FeatureMultiPolygon - geojson4326_points: FeatureCollectionPoints | null - geojson_origine_geo_systeme_id: GeoSystemeId - geojson_origine_perimetre: FeatureMultiPolygon - geojson_origine_points: FeatureCollectionPoints | null - geojson4326_forages: FeatureCollectionForages | null - geojson_origine_forages: FeatureCollectionForages | null - surface: KM2 | null - }> - >(() => { - const toPerimetre = ({ geojson4326_perimetre, surface }: DeepReadonly<{ geojson4326_perimetre: FeatureMultiPolygon; surface: KM2 }>) => ({ + const perimetre = computed<{ + geojson4326_perimetre: FeatureMultiPolygon + geojson4326_points: FeatureCollectionPoints | null + geojson_origine_geo_systeme_id: GeoSystemeId + geojson_origine_perimetre: FeatureMultiPolygon + geojson_origine_points: FeatureCollectionPoints | null + geojson4326_forages: FeatureCollectionForages | null + geojson_origine_forages: FeatureCollectionForages | null + surface: KM2 | null + }>(() => { + const toPerimetre = ({ geojson4326_perimetre, surface }: { geojson4326_perimetre: FeatureMultiPolygon; surface: KM2 }) => ({ geojson4326_perimetre, geojson4326_points: null, geojson_origine_geo_systeme_id: GEO_SYSTEME_IDS.WGS84, diff --git a/packages/ui/src/components/titre/titres-link.tsx b/packages/ui/src/components/titre/titres-link.tsx index 1d52bdc390cfa5008086a4c3bc49fea0e11bd2a8..3751f7cab76c2c065e61dc52ad735ca768cb9fdb 100644 --- a/packages/ui/src/components/titre/titres-link.tsx +++ b/packages/ui/src/components/titre/titres-link.tsx @@ -6,7 +6,7 @@ import { LinkableTitre, TitresLinkConfig } from '@/components/titre/titres-link- import { TitreStatut } from '../_common/titre-statut' import { TypeAheadSingle } from '../_ui/typeahead-single' import { TypeAheadMultiple } from '../_ui/typeahead-multiple' -import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' import { capitalize } from 'camino-common/src/strings' @@ -16,7 +16,7 @@ interface Props { onSelectTitres: (titres: TitreLink[]) => void } export const TitresLink = defineComponent<Props>(props => { - const display = (item: DeepReadonly<LinkableTitre>) => { + const display = (item: LinkableTitre) => { return ( <div class="flex flex-center"> <TitreStatut titreStatutId={item.titreStatutId} /> @@ -76,7 +76,7 @@ export const TitresLink = defineComponent<Props>(props => { search.value = searchLabel.toLowerCase() } - const getDateDebutEtDateFin = (titre: DeepReadonly<LinkableTitre>): string => { + const getDateDebutEtDateFin = (titre: LinkableTitre): string => { const dateDebut = titre.demarches .filter(({ demarcheDateDebut }) => !!demarcheDateDebut) .map(({ demarcheDateDebut }) => demarcheDateDebut) diff --git a/packages/ui/src/router/index.ts b/packages/ui/src/router/index.ts index a1e71e2e77c7e75066f4d4050b78d93ee9bf4519..4e31384de6fb9abc0733762ab01cba77b15bc5e4 100644 --- a/packages/ui/src/router/index.ts +++ b/packages/ui/src/router/index.ts @@ -5,7 +5,6 @@ import { Titres } from '../components/titres' import { isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools' import { CaminoRouteNames, routesDefinitions } from './routes' import { CaminoFiltre } from 'camino-common/src/filters' -import { DeepReadonly } from 'vue' const PageIntrouvableAlert = async () => { const { PageIntrouvableAlert } = await import('@/components/_ui/alert') @@ -127,7 +126,7 @@ declare module 'vue-router' { interface RouteMeta { menuSection: MenuSection | null title: string - filtres: DeepReadonly<CaminoFiltre[]> + filtres: Readonly<CaminoFiltre[]> } } const routes = { diff --git a/packages/ui/src/typings/maplibre-gl.d.ts b/packages/ui/src/typings/maplibre-gl.d.ts index c57cfcdc575b071ec68f929a96abf94dc34ab548..d2d208e1b42ab35f56fbd201879c390b0224b00b 100644 --- a/packages/ui/src/typings/maplibre-gl.d.ts +++ b/packages/ui/src/typings/maplibre-gl.d.ts @@ -1,5 +1,4 @@ import * as maplibre from 'maplibre-gl' -import { DeepReadonly } from 'vue' export type CaminoMapOptions = maplibre.MapOptions & { style: CaminoStyleSpecification } export class CaminoMapLibre extends maplibre.Map { @@ -8,11 +7,11 @@ export class CaminoMapLibre extends maplibre.Map { } export class CaminoLngLatBounds extends maplibre.LngLatBounds { - extend(obj: DeepReadonly<maplibre.LngLatLike | maplibre.LngLatBoundsLike>): this + extend(obj: maplibre.LngLatLike | maplibre.LngLatBoundsLike): this } export class CaminoGeoJSONSource extends maplibre.GeoJSONSource { - setData(data: string | DeepReadonly<maplibre.GeoJSON>): this + setData(data: string | maplibre.GeoJSON): this } export class CaminoStyleSpecification extends maplibre.StyleSpecification {} diff --git a/packages/ui/src/utils/vue-tsx-utils.ts b/packages/ui/src/utils/vue-tsx-utils.ts index 0f1dd59cce799fd4b502c5a96f2e59eca499de20..d22f32857707998257b08d09a28fe19b9ab57dd1 100644 --- a/packages/ui/src/utils/vue-tsx-utils.ts +++ b/packages/ui/src/utils/vue-tsx-utils.ts @@ -1,4 +1,4 @@ -import { DeepReadonly, readonly, ref, Ref } from 'vue' +import { readonly, ref, Ref } from 'vue' export const isEventWithTarget = (event: Event): event is FocusEvent & { target: HTMLInputElement } => 'target' in event @@ -13,11 +13,13 @@ export const random = (): number => { return x - Math.floor(x) } -export function useState<T>(initialState: T): [Readonly<Ref<DeepReadonly<T>>>, (value: T | DeepReadonly<T>) => void] { +export function useState<T>(initialState: T): [Ref<T>, (value: T) => void] { const state = ref<T>(initialState) as Ref<T> - const setState = (newState: T | DeepReadonly<T>) => { - state.value = newState as T + const setState = (newState: T) => { + state.value = newState } - return [readonly(state), setState] + // TODO 2024-12-03 avant on avait le deepreadonly qu'on a viré car trop encombrant dans nos types, ça débordait de partout dans le common/api et on avait des gros conflits avec les NonEmptyArray et les structures un peu complexes. + // On n'a pas trouvé de règle eslint pour vérifier que le state n'est jamais modifié, donc c'est dangereux :( + return [readonly(state) as Ref<T>, setState] }