Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Cartographie] Importer un fichier de tracé par Drag&Drop #2529

Merged
merged 7 commits into from
Sep 25, 2023

Conversation

louptheron
Copy link
Collaborator

@louptheron louptheron commented Sep 19, 2023

  • Cette PR inirialise la sortie de monitorfishMap du composant BaseMap.
  • Les actions liées à la cartographie sont maintenant dans des useCases au lieu d'être dans des composants React sans rendering (approche Push plutôt que Pull).

Linked issues


  • Tests E2E (Cypress)

@louptheron louptheron changed the title [Carto] Importer un fichier de tracé par Drag&Drop [Cartographie] Importer un fichier de tracé par Drag&Drop Sep 20, 2023
Copy link
Member

@ivangabriele ivangabriele left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C'est surtout des comments de forme ;).

initialMap.on('pointermove', event => throttleAndHandlePointerMove(event, initialMap))
initialMap.on('movestart', () => throttleAndHandleMovingAndZoom(initialMap))
initialMap.on('moveend', () => throttleAndHandleMovingAndZoom(initialMap))
monitorfishMap.setTarget(mapElement.current)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'aime beaucoup ce changement de pattern pour loader OpenLayer :).

Par contre j'ai un petit soucis avec le nom. Je l'aurais plutôt tout simplement appelé openLayer, customOpenLayer ou quelque chose dans le genre (l'habitude de nommer les instances par le même nom que la classe qu'elles instancient). On n'est a bien qu'un seul non ? Par défaut on sait qu'on est sur MonitorFish.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Autre comment/question : au tout premier render, OpenLayer n'est pas encore attaché au DOM, ce n'est pas un soucis de faire sans un isFirstLoad state ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alors dans ce cas il faudrait plutôt l'appeler openLayerMap car cet objet est un objet de type Map, et comme je trouvais que ça n'apportait pas au métier de rajouter le terme technique openlayers j'ai mis monitorfish, mais on peut mettre tout seimplement map.

Non ce n'est pas un souci pour le rattachement au DOM, on peut le set avant, il sera render quand il est rattaché.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

En effet c'est simplement le monitorfish qui me gênait mais sinon oui je te laisse choisir ^^. map me va bien (il faudra seulement faire attention dans notre vocabulaire à ce que Map / map soit bien la carte en elle-même et pas un emplacement (qu'on appelle plutôt MainWindow ou quelque chose comme ça).

Copy link
Member

@ivangabriele ivangabriele Sep 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C'est une lib du coup non ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Une instance quoi, vu que c'est pas utilisé pas d'autres projets ^^

Copy link
Member

@ivangabriele ivangabriele Sep 22, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oui j'avoue que je me demandais s'il n'avait pas sa place dans libs/ mais je te laisse choisir, les deux me paraissent logiques.

@@ -61,6 +62,10 @@ export const mainReducer = {
beaconMalfunction: beaconMalfunctionReducer,
// TODO Pass that to singular.
controls: controlReducer,
customZone: persistReducerTyped(
{ ...getCommonPersistReducerConfig<CustomZoneState>('mainPersistorCustomZone', ['zones']) },
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On doit le cloner ? Le return est une nouvelle variable normalement.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je ne sais pas si je suis très fan du sous-dossier générique components. J'aurais plutôt tendance à plutôt garder les composants "root" à la racine de la feature dans un sous-dossier qui porte leur nom (ici, par exemple : features/Map/CustomZone/index.tsx ou features/MapLayer/CustomZone/index.tsx. Et n'avoir comme sous-sous-dossier de features que les composants plus complexes et leurs enfants. Une feature reste dans mon esprit une "partie métier" que ce soit organisationnel (ex : Menu) ou lié à une entité (ex : Mission), on n'est pas sensé avoir de cas où le nom du composant d'une feature est le même que celui de la feature elle-même.

Dans le cas d'un menu par ex, on se retrouverait avec soit features/Menu/MainWindowMenu/index.tsx, soit avec features/MainWindow/Menu/index.tsx (je crois que tu préfères cette logique et ça me va bien ^^), mais pas avec features/Menu/Menu/index.tsx.

Le seul cas où je vois la nécessité d'un sous-dossier générique est lors de composants partagés par plusieurs composants d'une même feature (features/MyFeature/shared/MySharedComponent.tsx ou features/MyFeature/shared/MySharedComponent/index.tsx).

Copy link
Collaborator Author

@louptheron louptheron Sep 21, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pour CustomZone, c'est une liste de zones, j'ai un composant CustomZones et CustomZone, tu nommerais comment le composant enfant CustomZone si CustomZones devient index.tsx ?

Dans les patterns "feature-based" que je vois sur Internet, il ya souvent le dossier components, on peut l'enlever mais il faut qu'une feature représente bien l'élément affiché dans ce cas.

Copy link
Collaborator Author

@louptheron louptheron Sep 21, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Et par exemple pour la feature Vessel, il y a VesselList, VesselSearch, VesselSidebar, etc. Il y a beaucoup de composants mais je ne vois pas de composant "maître" qui pourrait prendre le index.ts dans le dossier features/Vessel

Copy link
Member

@ivangabriele ivangabriele Sep 22, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je me suis peut-être mal exprimé mais mon avis ne considère pas qu'il devrait y avoir un index.tsx à la racine d'une feature, au contraire qu'il ne devrait jamais y en avoir. Même lorsqu'il n'y a qu'un seul composant (pour l'instant) dans la feature (ça ne devrait pas arriver si souvent d'ailleurs).

Si on reprend ton exemple Vessel ça donne bien, par exemple :

- features/
  - Vessel/
    - shared/
      - AFeatureLevelSharedComponent.tsx
    - VesselList/
      - index.tsx # importe `AFeatureLevelSharedComponent.tsx`
    - VesselSearch/
      - index.tsx # importe `AFeatureLevelSharedComponent.tsx`
    - VesselSidebar.tsx # pour un composant tout simple

sans index.tsx à la racine. Par contre on peut bien sûr mettre tout ce qu'on veut d'autre de commun à la racine de la feature : utils.ts, constants.ts, etc. Tout, sauf des composants. D'où l'idée du shared/ lorsqu'on en a besoin.

Copy link
Member

@ivangabriele ivangabriele Sep 22, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Et pour la feature CustomZone, j'ai l'impression que si l'on se retrouve à avoir un nom de composant égal au nom de la feature c'est :

  • soit que le nom de la feature n'est pas assez générique (tout en restant métier)
  • soit que le nom du composant de la feature n'est pas assez précis
  • soit que les composants de cette feature devraient aller dans une feature déjà existante

Mais dans ton cas le composant CustomZone est un enfant de CustomZones donc il devrait selon moi aller dans le dossier CustomZones, à moins qu'on l'utilise ailleurs (auquel cas on le remonte à la racine de la feature).

Et je propose de (c'est un exemple pour donner une idée) :

  • renommer le composant CustomZones en CustomZoneList
  • renommer le sous-composant CustomZone en Item ou CustomZoneItem
  • passer donc le composant Item dans le dossier CustomZoneList et le composant EditDialog dans le dossier CustomZoneList
- features/
  - CustomZone/
    - CustomZoneList/
      - Item/
        - EditDialog.tsx
        - index.tsx
      - index.tsx

Il me semble qu'on avait ça en tête avec @claire2212 (je te pingue pour que tu me dises si je dis des bêtises et aussi pour avoir ton avis ^^) ?

Mais peut-être que ça te gêne d'avoir de la profondeur dans les dossiers @louptheron ?

Copy link
Member

@ivangabriele ivangabriele Sep 22, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je copie nos deux commentaires privés ici :

Loup :

Du coup ça pose la question de la hierarchie des features:
Dans ma PR précédente, j'avais Logbook : #2506
Mais en soit Logbook fait partie de la "macro" feature Vessel
Donc la question est : on met Logbook dans Vessel (mais du coup ça fait des potentiellement des slices/apis/types dans des dossiers à N-2) ?

Ivan :

Et pour répondre ici en attendant la discussion, "à chaud", ce qui m'embête avec les sous-features est que ce ne sera pas évident de différencier visuellement les sous-features des composants d'une feature. Mais je suppose que dans ce cas tu as envie d'avoir un components/ qui pour le coup a plus de sens. C'est juste qu'autant ça ne me gêne pas d'avoir du n+2 n+3 dans les les composants des features, autant le feature-based est pour moi sensé être relativement flat en ce qui concerne les features elles-mêmes (le principe feature-based ne vient pas de Facebook qui mettent tout à la racine ?).

Mais j'avoue qu'en faisant des recherches à l'instant je retrouve ce dossier components à chaque fois (vu sur 5 articles à ce sujet) donc ce que tu fais a l'air d'être la convention la plus courante 🙂
https://reboot.studio/blog/folder-structures-to-organize-react-project
image

Copy link
Member

@ivangabriele ivangabriele Sep 22, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pour l'instant, je vote donc pour :

  • garder ton dossier components/ comme ça a l'air d'être conventionnel
  • pas de sous-feature pour rester flat
  • faire attention à avoir des naming de composants qui ne soient pas les mêmes que celui de leur feature :
    • des noms de feature relativement génériques tout en restant métier
    • des noms de composants un peu plus précis lorsqu'ils sont à la racine du composant
    • ne pas répêter le nom du composant parent dans un sous-component
  • pas de dossier shared/ :
    • on met les composants partagés au sein d'une même feature à la racine du sous-dossier components
    • composants partagés entre plusieurs features ? (on avait dit qu'on le mettrait toujours dans monitor-ui non ? j'ai un doute)

Exemple complet :

|-- components/ # ???
|   |-- ProjectComponent.tsx # ???
|-- features/
|   |-- Menu/
|   |   |-- components/
|   |   |   |-- MainWindowRightMenu/
|   |   |   |   |-- index.tsx
|   |   |   |-- SideWindowMenu/
|   |   |   |   |-- index.tsx # importe `ProjectComponent.tsx`
|   |-- Vessel/
|   |   |-- components/
|   |   |   |-- VesselButton.tsx
|   |   |   |-- VesselAdministrationTable/
|   |   |   |   |-- Row
|   |   |   |   |   |-- constants.ts
|   |   |   |   |   |-- Label.tsx
|   |   |   |   |   |-- index.tsx # importe `ProjectComponent.tsx` & `VesselButton.tsx`
|   |   |   |   |-- index.tsx
|   |   |   |-- VesselListDialog/
|   |   |   |   |-- Item
|   |   |   |   |   |-- constants.ts
|   |   |   |   |   |-- index.tsx # importe `VesselButton.tsx`
|   |   |   |   |-- index.tsx

<Button accent={Accent.TERTIARY} onClick={onCancel}>
Annuler
</Button>
<Button accent={Accent.PRIMARY} disabled={!name} Icon={Icon.Save} onClick={() => name && onConfirm(name)}>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Micro détail mais j'aurais plutôt renvoyé un string | undefined et géré ça dans la fonction.

return
}

const features =
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

features ne peut être null ou undefined ici ? Parce que je vois un .getSource()? et un forEach() ensuite, ca serait bizarre que le forEach passe en TS.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Il y a un || []

const features =
layer
.getSource()
?.getFeatures()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'imagine que ça s'applique aussi ici même s'il n'y a pas de forEach pour le coup.

return
}

const features =
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

//

@sonarcloud
Copy link

sonarcloud bot commented Sep 25, 2023

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 7 Code Smells

No Coverage information No Coverage information
0.0% 0.0% Duplication

@louptheron louptheron merged commit 1ab9ad7 into master Sep 25, 2023
25 checks passed
@louptheron louptheron deleted the loup/import-custom-zones branch September 25, 2023 10:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Importer un fichier de tracé par Drag&Drop et le stocker dans "Mes zones importées"
2 participants