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

Only lead climbs #9

Merged
merged 39 commits into from
Jan 31, 2025
Merged

Only lead climbs #9

merged 39 commits into from
Jan 31, 2025

Conversation

pectum83
Copy link
Contributor

@pectum83 pectum83 commented Sep 30, 2023

Evolution liée au ticket "croix en tete et/ou en moulinette oblyk/oblyk-app#59" pour les deux points.
1 - Permet de n'afficher que les croix en tête avec un selecteur pour ceux qui veulent voir aussi les moulinettes.
2 - Ne compte pas les répétitions d'une même voie dans les croix

Corrige également :

  • les grandes voies sont comptées comme croix dans le niveau max parmis les sections réalisées dans l'ascent (auparavant elles comptaient dans le niveau min de toutes les sections de la crag_route)
  • la hauteur des sections non faites d'une grande voie etaient comptées dans le total grimpé

A combiner avec la pull request sur oblyk-app

Copy link
Contributor

@lucien-chastan lucien-chastan left a comment

Choose a reason for hiding this comment

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

Hello @pectum83
Encore désolé pour le temps de relecture : /
Voici mes commentaires, n'hésite pas si tu as des questions

app/controllers/api/v1/log_books/outdoors_controller.rb Outdated Show resolved Hide resolved
app/models/ascent.rb Outdated Show resolved Hide resolved
app/models/log_book/outdoor/chart.rb Outdated Show resolved Hide resolved
app/models/log_book/outdoor/figure.rb Outdated Show resolved Hide resolved
# Conflicts:
#	app/controllers/api/v1/current_users_controller.rb
Updated the handling of the 'only_lead_climbs' parameter across various controllers to ensure consistent behavior by casting the parameter to boolean using ActiveModel. Adjusted schema character set from utf8mb4 to utf8mb3 for multiple tables, optimizing compatibility. Added debug logs and comments within methods related to climbing figures and charts to facilitate future debugging and enhancements.
Introduce 'second' scope to filter ascents based on top rope and multi-pitch second roping statuses. This enhancement improves query flexibility for retrieving specific ascent types.
Introduce a unified filter system using `CragAscentFilter` for ascent data, replacing individual filtering logic in controllers and models. This simplifies the codebase, enhances reusability, and improves maintainability of climbing data filters and analytics.
Streamline and centralize filtering logic through the new `CragAscentFilters` class, replacing scattered filter handling. Simplify API endpoints, models, and services by delegating responsibilities to the updated filtering mechanism, improving maintainability and performance.
db/schema.rb Outdated Show resolved Hide resolved
.gitignore Outdated Show resolved Hide resolved
@pectum83 pectum83 closed this Dec 12, 2024
@pectum83 pectum83 reopened this Dec 12, 2024
@pectum83
Copy link
Contributor Author

Salut @lucien-chastan,

Désolé pour les fausses manip sur la PR mais je n'ai pas l'habitude de gilthub. J'espère que ça ne t'as pas trop spammé.

J'ai intégré tes remarques précédentes. L'intégration des climbing_type en filters a finalement conduit a pas mal de modif. Au passage comme je devais refactoré pas mal de choses j'en ai profité pour homogénéiser certaines parties qui faisaient la même chose de deux manières différentes. J'espère que je n'ai rien cassé. J'ai fait pas mal de tests mais ma base de donnée est toute petite et je ne vois pas les éventuels problèmes de latence.

Les points qui restent en attente (et que je ferai avant merge selon ce que tu décides):

  • je n'ai pas mis le button toggle de filtre dans la vue des "autres" users. Mais je peux si tu préfères
  • j'ai mis le résultat des requetes de filtre dans un cache court de 30 sec (le temps de charger les différents widgets de la page) mais je ne sais pas si ca sera compatible de l'utilisation massive et de ton serveur. Il y a un bool en dur (@use_cache = true) dans crag_ascent_filters pour ne pas faire de cache. Mais si tu préfère je retire le cache.

Vue l'ampleur des changements je pense qu'il faudra une autre passe de commentaires et de reprise de code pour converger vers quelque chose qui te corresponde. J'ai essayé d'être homogène avec le reste du code mais c'est pas évident de savoir comment tu aurais fait les choses.

N'hésites pas à faire des remarques et je modifierai.

Christophe.

@lucien-chastan
Copy link
Contributor

Hello @pectum83 !

Quand je vois ce développement je me dis qu'il y a quelque chose à faire !

Mais qui va demander un peu plus de travail 😬

En fait avoir un bouton 'uniquement à vue' je me dis : "et si je veux voir uniquement mes flashs ?"
Idem pour "sans moulinette", ça me kick toujours de sélectionner une négation.

Un autre sujet, et c'est là où ça va plus loin, depuis un moment je me dis que c'est dommage de pouvoir choisir le type d'escalade (bloc, voie, grand voie, etc.) uniquement sur le liste, et par sur les chiffres ni sur Analyticks.

Donc je te propose d'aller un peu plus loin 😅

Voici ce que j'ai en tête :

image

Avant les onglets, on ajoute une boîte que l'on peu déplier avec le bouton (FILTRER MON CARNET)
ça déploie la boîte et laisse choisir parmi "le type de grimpe / le status / l'encordement" de choisir un ou plusieurs items
et on soumet le filtre avec le bouton 'Filtrer'

Ce qui serait bien c'est que les filtres soit passé en paramètres des liens des onglets en dessous, pour garder les filtrer entre les différentes page.

Tu en pense quoi ?

C'est fait vite fait, il y a des choses à améliorer en terme d'affichage, c'est dans l'esprit

(ça risque de poser des questions sur la page 'Tick list', 'Projet' et "ma carte" qui sont un peu différentes ...)

@pectum83
Copy link
Contributor Author

Ca me plait, je regarde ça.
Pour l'instant les filtres sont déjà échangés avec l'onglet Analytik au travers du LocalStorage. Ca permet aussi de conserver le filtre préféré entre chaque session.
J'ajouterai bien aussi un bouton reset pour remettre tous les filtres off d'un clic.

@lucien-chastan
Copy link
Contributor

Cool !

Le LocalStorage ça marche aussi !

Le bouton reste bonne idée 👍

Désolé de rajouter des choses à faire sur cette PR que j'ai mis temps de temps à relire !

@lucien-chastan lucien-chastan added the outdoor tag for the outdoor part label Dec 21, 2024
@pectum83
Copy link
Contributor Author

Voila une nouvelle version generalisée des filtres. N'hesites pas à me dire si tu veux des amélioration d'aspect ou de confirmité de code.
Screenshot from 2024-12-27 09-21-20
Screenshot from 2024-12-27 09-23-42
Screenshot from 2024-12-27 09-23-51
Screenshot from 2024-12-27 09-24-15
Screenshot from 2024-12-27 09-24-23

Copy link
Contributor

@lucien-chastan lucien-chastan left a comment

Choose a reason for hiding this comment

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

Merci pour le clean que tu as fait dans certaines parties du code où il y avait beaucoup de répétions !

app/controllers/api/v1/current_users_controller.rb Outdated Show resolved Hide resolved
app/services/crag_ascent_filters.rb Outdated Show resolved Hide resolved
app/services/crag_ascent_filters.rb Outdated Show resolved Hide resolved
app/services/crag_ascent_filters.rb Outdated Show resolved Hide resolved
app/services/crag_ascent_filters.rb Outdated Show resolved Hide resolved
app/models/log_book/outdoor/chart.rb Outdated Show resolved Hide resolved
app/models/log_book/outdoor/chart.rb Outdated Show resolved Hide resolved
app/services/crag_ascent_filters.rb Outdated Show resolved Hide resolved
app/services/crag_ascent_filters.rb Outdated Show resolved Hide resolved
app/controllers/api/v1/log_books/outdoors_controller.rb Outdated Show resolved Hide resolved
scope :by_ascent_statuses, ->(ascentStatusList) { where(ascent_status: ascentStatusList) }
scope :by_roping_statuses, ->(ropingStatusList) { where(roping_status: ropingStatusList) }
scope :by_climbing_types, ->(climbingTypesList) { joins(:crag_route).where(crag_routes: { climbing_type: climbingTypesList }) }
scope :by_ascent_statuses, ->(ascentFilter) { where(ascent_status: ascentFilter) }
Copy link
Contributor

Choose a reason for hiding this comment

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

du coup snake_case ici 😅

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Ah oui. C'est fait.

@@ -127,12 +122,8 @@
namespace :log_books do
resources :outdoors, only: %i[] do
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Dans la mesure on on a factorisé le log_books pour le current user et les users en ajoutant un parametre user_id, il serait plus propre de déplacer le namespace log_books ailleurs que dans current_user. Qu'en penses tu ?

Copy link
Contributor

Choose a reason for hiding this comment

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

Je ferais ça dans un second temps, s'il y a besoin, c'est plus simple et plus sécurisé que tous ce qui touche à son compte passe par current_users

Par contre il va falloir la route
users/:user_uuid/log_books/outoors/stats sinon la vision d'un carnet de croix d'un autre grimpeur ne fonctionnera plus, ou alors il faut laisse les routes dans users/ si on ne fait pas la refacto

Copy link
Contributor Author

Choose a reason for hiding this comment

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

En fait j’ai déjà factorisé le back en ajoutant le test du user dans outdoorcontroller (ligne 84). Du coup le front des users appelle outdoorcontroller avec le user en param. C’est pour ça que je proposais de sortir la route outdoor du current user.

Copy link
Contributor

Choose a reason for hiding this comment

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

ha merde désolé je n'avais pas vu que tu avais refactorisé pour pouvoir appeler le carnet de croix d'un autre user depuis la route /current_users/log_books/outdoors/stats.json

Ça ne me semble pas être une bonne chose, ça brise la logique que current_user c'est forcément le user connecté, et users c'est les autres

Et maintenant que j'y pense ça serai étrange de pouvoir filtrer le carnet de croix d'une autre personnes, comme on ne peux pas voir toutes les infos des autres (comme la carte d'escalade, les tick list, l'analytics, etc.)

je préfère qu'il y ai une route dans users qui initialise le module de stats avec des filtres par défait qu'un user ne peux pas changer

En fait j'ai l'impression que la partie carnet de croix d'un autre user pourrais ne pas changer ?
Peut-être juste passer des filtres par défaut dans l'initialisation sans lancer la possibilité de les changer

@pectum83
Copy link
Contributor Author

ok je vais supprimer les filtres sur les users.
Pour la logique current_user / user, ce que je proposais c'était que la logique reste dans le front mais que les deux pages appellent la meme api (LogBookOutdoorApi) et du coup de sortir cette api de current user (avec un param user). Ca m'a permis de tout factoriser et de supprimer tous les doublons qui avaient des petites différences tout en faisant la même chose. En fait c'est ma "maniaquerie" perso de ne jamais avoir plus de 10 lignes de code dupliqué (je l'ai meme dans mon linter et husky m'interdit de commiter ;) ). Ceci étant dit, ok pour suivre tes souhaits d'architecture. Je dupliquerai l'api stats dans users_controller avec les filtres en dur pour ne rien filtrer (ou tout simplement pas de filtre et direct un .made). ET du coup pas besoin de factorisation dans le front.

@pectum83
Copy link
Contributor Author

C'est fait. J'ai juste laissé le filtre "climbing type" dans les autres users pour rester identique a ce qu'il y a vait avant. Pour les autres users je n'ai pas fait de local storage. Ca reset le filtre climbing types a tous les types à chaque refresh.
Et tout est séparé entre les api current_user et users.

Copy link
Contributor

@lucien-chastan lucien-chastan left a comment

Choose a reason for hiding this comment

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

idem que pour l'autre PR, 2 / 3 retour sur de la typo

mais on va être bon !

@@ -85,7 +81,16 @@ def ascents_of_crag
private

def set_user
@user = @current_user
@user = @current_user
Copy link
Contributor

Choose a reason for hiding this comment

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

indentation

app/models/log_book/outdoor/list.rb Outdated Show resolved Hide resolved
app/models/log_book/outdoor/list.rb Outdated Show resolved Hide resolved
@pectum83
Copy link
Contributor Author

Normalement ca devrait être tout bon api et app

@pectum83
Copy link
Contributor Author

Dernière retouche : finalement j'ai supprimé les uniq(crag_id) dans les charts et les figures. Avec les filtres complets il suffit de ne pas selectionner "répetition" et "enchainé"

@lucien-chastan
Copy link
Contributor

Parfait !
Je pense merge ça aujourd'hui ou demain : )

@lucien-chastan lucien-chastan merged commit d987de7 into oblyk:master Jan 31, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
outdoor tag for the outdoor part
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants