-
Notifications
You must be signed in to change notification settings - Fork 7
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
Conversation
5b8c5e9
to
133641d
Compare
There was a problem hiding this 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) |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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 ?
There was a problem hiding this comment.
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é.
There was a problem hiding this comment.
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).
There was a problem hiding this comment.
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 ?
There was a problem hiding this comment.
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 ^^
There was a problem hiding this comment.
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']) }, |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
).
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
enCustomZoneList
- renommer le sous-composant
CustomZone
enItem
ouCustomZoneItem
- passer donc le composant
Item
dans le dossierCustomZoneList
et le composantEditDialog
dans le dossierCustomZoneList
- 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 ?
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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)}> |
There was a problem hiding this comment.
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 = |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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() |
There was a problem hiding this comment.
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 = |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
//
Kudos, SonarCloud Quality Gate passed! 0 Bugs No Coverage information |
monitorfishMap
du composantBaseMap
.useCases
au lieu d'être dans des composants React sans rendering (approche Push plutôt que Pull).Linked issues