Skip to content

Commit 6cf845a

Browse files
committed
Fix infinite scroll
1 parent 1bdf7b1 commit 6cf845a

File tree

136 files changed

+1523
-1553
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

136 files changed

+1523
-1553
lines changed

app/Http/Controllers/Public/HomeController.php

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,26 @@ public function index(Request $request)
2424

2525
$equipments = $this->getFilteredEquipments($request, $locationPreferences);
2626

27+
// Handle full page load vs. infinite scroll request
28+
if (!request()->header('X-Inertia')) {
29+
// Full page load - fetch all pages up to current
30+
$currentPage = $request->input('page', 1);
31+
$perPage = 10;
32+
$allResults = collect();
33+
34+
for ($page = 1; $page <= $currentPage; $page++) {
35+
$pageResults = $this->getFilteredEquipments($request, $locationPreferences, $page, $perPage);
36+
$allResults = $allResults->concat($pageResults->items());
37+
}
38+
39+
$equipments = new \Illuminate\Pagination\LengthAwarePaginator(
40+
$allResults,
41+
$this->getFilteredEquipments($request, $locationPreferences)->total(),
42+
$perPage,
43+
$currentPage
44+
);
45+
}
46+
2747
return Inertia::render('Public/Home', [
2848
'equipments' => $equipments,
2949
'filters' => [
@@ -48,7 +68,7 @@ public function index(Request $request)
4868
]);
4969
}
5070

51-
private function getFilteredEquipments(Request $request, $locationPreferences)
71+
private function getFilteredEquipments(Request $request, $locationPreferences, $page = null, $perPage = 10)
5272
{
5373
$query = Equipment::query()
5474
->select([
@@ -104,6 +124,10 @@ private function getFilteredEquipments(Request $request, $locationPreferences)
104124
$q->whereIn('organization_id', $request->organizations);
105125
});
106126

107-
return $query->paginate(10);
127+
if ($page) {
128+
return $query->paginate($perPage, ['*'], 'page', $page);
129+
}
130+
131+
return $query->paginate($perPage);
108132
}
109133
}

docs/INFINITE_LOAD.md

Lines changed: 44 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
# Infinite Load Implementation avec WhenVisible d'Inertia.js
1+
# Infinite Load Implementation avec WhenVisible d'Inertia.js v2.0
22

33
## Vue d'ensemble
44

5-
Cette implémentation utilise le composant `WhenVisible` d'Inertia.js v2.0+ pour créer un infinite load on scroll pour la liste des équipements.
5+
Cette implémentation utilise le composant `WhenVisible` d'Inertia.js v2.0 pour créer un infinite load on scroll pour la liste des équipements, basée sur l'exemple de [Bilal Haidar sur dev.to](https://dev.to/bhaidar/implementing-infinite-scrolling-with-laravel-inertiajs-v20-and-vue-3-3il).
66

77
## Fonctionnalités
88

99
- **Infinite Load Automatique** : Chargement automatique des nouveaux éléments quand l'utilisateur atteint le bas de la liste
10-
- **WhenVisible Component** : Utilisation du composant officiel d'Inertia.js pour la détection de visibilité
10+
- **WhenVisible Component** : Utilisation du composant officiel d'Inertia.js v2.0 pour la détection de visibilité
1111
- **Fallback Manuel** : Bouton "Charger plus" en cas de problème avec la détection automatique
1212
- **Animations** : Transitions fluides pour les nouveaux éléments qui apparaissent
1313
- **États de Chargement** : Indicateurs visuels pendant le chargement
14-
- **Messages de Succès** : Feedback utilisateur quand de nouveaux éléments sont chargés
14+
- **Gestion Full Page Load** : Support des rechargements de page avec maintien de la position de scroll
1515

1616
## Architecture
1717

1818
### Backend (Laravel)
1919

2020
**HomeController.php**
21-
- Méthode `index()` simplifiée pour supporter les requêtes Inertia.js
22-
- Méthode privée `getFilteredEquipments()` pour la réutilisation du code
23-
- Gestion automatique de la pagination par Inertia.js
21+
- Gestion intelligente des requêtes full page vs infinite scroll
22+
- Chargement de toutes les pages précédentes lors d'un rechargement
23+
- Méthode `getFilteredEquipments()` optimisée pour la pagination
2424

2525
### Frontend (Vue.js)
2626

@@ -29,20 +29,9 @@ Cette implémentation utilise le composant `WhenVisible` d'Inertia.js v2.0+ pour
2929
- Passage direct des props d'équipements
3030

3131
**ResultsSection.vue**
32-
- Utilisation du composant `WhenVisible` d'Inertia.js
32+
- Utilisation du composant `WhenVisible` d'Inertia.js v2.0
33+
- Configuration avec `:params` au lieu de `:data`
3334
- Gestion automatique des états de chargement
34-
- Animations CSS pour les nouveaux éléments
35-
- Fallback manuel avec bouton
36-
37-
## Utilisation
38-
39-
### Déclenchement Automatique
40-
41-
Le composant `WhenVisible` se déclenche automatiquement quand l'utilisateur fait défiler jusqu'à l'élément de déclenchement.
42-
43-
### Déclenchement Manuel
44-
45-
Si la détection automatique ne fonctionne pas, un bouton "Charger plus d'équipements" est disponible.
4635

4736
## Configuration
4837

@@ -51,51 +40,40 @@ Si la détection automatique ne fonctionne pas, un bouton "Charger plus d'équip
5140
```vue
5241
<WhenVisible
5342
v-if="equipments.has_more || equipments.next_page_url"
54-
:href="route('home')"
55-
:params="loadMoreParams"
56-
:method="'get'"
57-
:preserve-state="true"
58-
:preserve-scroll="true"
59-
:only="['equipments']"
60-
@before="onBeforeLoad"
61-
@success="onLoadSuccess"
62-
@error="onLoadError"
43+
:params="{
44+
data: {
45+
page: equipments.current_page + 1,
46+
},
47+
only: ['equipments'],
48+
}"
6349
>
6450
<template #default="{ loading }">
6551
<!-- Contenu du bouton/indicateur -->
6652
</template>
6753
</WhenVisible>
6854
```
6955

70-
### Paramètres de Chargement
71-
72-
```javascript
73-
const loadMoreParams = computed(() => {
74-
const nextPage = props.equipments.current_page + 1;
75-
return {
76-
page: nextPage,
77-
...(props.startDate && { start_date: props.startDate }),
78-
...(props.endDate && { end_date: props.endDate })
79-
};
80-
});
81-
```
82-
83-
### Animations CSS
84-
85-
```css
86-
@keyframes fadeIn {
87-
from {
88-
opacity: 0;
89-
transform: translateY(20px);
90-
}
91-
to {
92-
opacity: 1;
93-
transform: translateY(0);
94-
}
95-
}
96-
97-
.animate-fade-in {
98-
animation: fadeIn 0.5s ease-out forwards;
56+
### Backend Pagination Handling
57+
58+
```php
59+
// Handle full page load vs. infinite scroll request
60+
if (!request()->header('X-Inertia')) {
61+
// Full page load - fetch all pages up to current
62+
$currentPage = $request->input('page', 1);
63+
$perPage = 10;
64+
$allResults = collect();
65+
66+
for ($page = 1; $page <= $currentPage; $page++) {
67+
$pageResults = $this->getFilteredEquipments($request, $locationPreferences, $page, $perPage);
68+
$allResults = $allResults->concat($pageResults->items());
69+
}
70+
71+
$equipments = new \Illuminate\Pagination\LengthAwarePaginator(
72+
$allResults,
73+
$this->getFilteredEquipments($request, $locationPreferences)->total(),
74+
$perPage,
75+
$currentPage
76+
);
9977
}
10078
```
10179

@@ -105,8 +83,8 @@ const loadMoreParams = computed(() => {
10583
2. **UX** : Expérience fluide sans rechargement de page
10684
3. **Accessibilité** : Fallback manuel disponible
10785
4. **Maintenabilité** : Code modulaire et réutilisable
108-
5. **Feedback** : Indicateurs visuels clairs pour l'utilisateur
109-
6. **Intégration Native** : Utilisation des composants officiels d'Inertia.js
86+
5. **SEO Friendly** : Support des rechargements de page
87+
6. **Intégration Native** : Utilisation des composants officiels d'Inertia.js v2.0
11088

11189
## Dependencies
11290

@@ -117,16 +95,14 @@ const loadMoreParams = computed(() => {
11795

11896
Pour tester l'implémentation :
11997

120-
1. Aller sur la page d'accueil
121-
2. Faire défiler jusqu'en bas de la liste
98+
1. Aller sur la page d'accueil (`/`)
99+
2. Faire défiler jusqu'en bas de la liste d'équipements
122100
3. Vérifier que de nouveaux éléments se chargent automatiquement
123101
4. Vérifier les indicateurs de chargement
124102
5. Tester le bouton de chargement manuel si nécessaire
125-
6. Vérifier les messages de succès dans la console
103+
6. Recharger la page et vérifier que la position de scroll est maintenue
126104

127-
## Différences avec l'ancienne implémentation
105+
## Références
128106

129-
- **Suppression de l'Intersection Observer manuel** : Remplacé par le composant `WhenVisible`
130-
- **Simplification du backend** : Plus besoin de gérer les requêtes AJAX séparément
131-
- **Gestion automatique des états** : Inertia.js gère automatiquement la fusion des données
132-
- **Code plus propre** : Moins de logique personnalisée, plus de composants officiels
107+
- [Article original de Bilal Haidar](https://dev.to/bhaidar/implementing-infinite-scrolling-with-laravel-inertiajs-v20-and-vue-3-3il)
108+
- [Documentation Inertia.js](https://inertiajs.com/load-when-visible)

public/build/assets/AccordionTrigger.vue_vue_type_script_setup_true_lang-D6Sh2SW5.js renamed to public/build/assets/AccordionTrigger.vue_vue_type_script_setup_true_lang-D4QOVeHb.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/build/assets/AddressInput-Bc2GQiSR.js renamed to public/build/assets/AddressInput-C4wdUaxR.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/build/assets/AdminLayout-BLCdGHUG.js renamed to public/build/assets/AdminLayout-BOSV1aJD.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/build/assets/Appearance-BIJYNQwM.js renamed to public/build/assets/Appearance-HNvpwQox.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/build/assets/AuthLayout.vue_vue_type_script_setup_true_lang-DsPqFazs.js renamed to public/build/assets/AuthLayout.vue_vue_type_script_setup_true_lang-CeW4XZWb.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/build/assets/CardContent.vue_vue_type_script_setup_true_lang-C0yh-7SO.js renamed to public/build/assets/CardContent.vue_vue_type_script_setup_true_lang-D7_ETdnV.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)