{% include checkCustomTemplate('SejourHotel/availability/vuejs-components/item-hotel.html.twig') %}
<script>
let itemHotel2 = itemHotel
var vjsListHotels = new Vue({
el: "#vjs-list-hotels",
data: {
paginate: ['pagin_hotels'],
hotels: [],
BookingCreation: [],
hotel_loading: 1,
nbr_room: 0,
paginate_per: {{ configAffichage.HOTEL.INTERVALLE_PAGINATION|split('default')[1] }},
progressHotels: 0, // Ajout pour la barre de progression
totalHotels: 0, // Ajout pour la barre de progression
loadedHotels: 0, // Ajout pour la barre de progression
recap: {
checkin: '',
checkout: '',
destination: '',
occupations: ''
}
},
computed: {
filteredHotels() {
return this.hotels
.filter(htl => {
if (typeof vjsSearchNomsHotels === 'undefined' || typeof vjsRefineResult === 'undefined')
return true;
return (
(vjsSearchNomsHotels.filtre_noms.length == 0 || $.inArray(htl.Hotel.Name, vjsSearchNomsHotels.filtre_noms) != -1) &&
(vjsRefineResult.filtre_etoiles.length == 0 || $.inArray(htl.DataFiltre.etoiles + '', vjsRefineResult.filtre_etoiles) != -1) &&
(vjsRefineResult.filtre_arrangements.length == 0 || ($(htl.DataFiltre.arrangements).filter(vjsRefineResult.filtre_arrangements)).length > 0) &&
(vjsRefineResult.filtre_zones.length == 0 || $.inArray(htl.DataFiltre.zone, vjsRefineResult.filtre_zones) != -1) &&
(vjsRefineResult.filtre_tags.length == 0 || ($(htl.DataFiltre.tags).filter(vjsRefineResult.filtre_tags)).length > 0) &&
(vjsRefineResult.filtre_chambres.length == 0 || ($(htl.DataFiltre.chambres).filter(vjsRefineResult.filtre_chambres)).length > 0) &&
(!vjsRefineResult.filtre_recommander || htl.DataFiltre.recommander > 0) &&
(!vjsRefineResult.filtre_promo || htl.DataFiltre.promo > 0) &&
(!vjsRefineResult.filtre_enfant_gratuit || htl.DataFiltre.enfantGratuit) &&
(!vjsRefineResult.filtre_rembourssable || htl.DataFiltre.rembourssable) &&
(htl.min_arrangement.min_prices >= vjsRefineResult.filre_prix[0] && htl.min_arrangement.min_prices <= vjsRefineResult.filre_prix[1]) &&
(!vjsRefineResult.filtre_disponible || htl.DataFiltre.disponible)
)
})
.sort((a, b) => {
if (typeof vjsSortResult === 'undefined')
return true;
let trie = vjsSortResult.trie.split('-')[0]
let direction = (vjsSortResult.trie.split('-')[1] == 'asc' ? 1 : -1)
var a1 = a.DataSort[trie], b1 = b.DataSort[trie];
if (a1 == b1) return 0;
return a1 > b1 ? 1 * direction : -1 * direction;
}
);
}
},
methods: {
scrollToTopHotels() {
// Force le scroll à fonctionner avec plusieurs méthodes
const self = this;
// Attendre que le DOM soit complètement mis à jour
this.$nextTick(() => {
// Méthode 1: scroll sur l'élément ref
if (self.$refs.listeHotels) {
try {
if (typeof self.$refs.listeHotels.scrollIntoView === 'function') {
self.$refs.listeHotels.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
} catch(e) {
console.log('Erreur scrollIntoView:', e);
}
}
// Attendre un peu puis appliquer les fallbacks
setTimeout(() => {
// Méthode 2: window.scrollTo
try {
window.scrollTo({
top: 0,
behavior: 'smooth',
left: 0
});
} catch(e) {
console.log('Erreur window.scrollTo:', e);
}
// Méthode 3: document.documentElement
try {
document.documentElement.scrollTop = 0;
document.documentElement.scrollLeft = 0;
} catch(e) {
console.log('Erreur documentElement:', e);
}
// Méthode 4: document.body
try {
document.body.scrollTop = 0;
document.body.scrollLeft = 0;
} catch(e) {
console.log('Erreur body:', e);
}
// Méthode 5: jQuery si disponible
if (typeof $ !== 'undefined') {
try {
$('html, body').animate({scrollTop: 0}, 'slow');
} catch(e) {
console.log('Erreur jQuery:', e);
}
}
}, 300);
});
}
},
updated() {
checkEllipsisActive('#vjs-list-hotels')
},
watch: {
filteredHotels(newVal, oldVal) {
if (newVal.length !== 0 && oldVal.length === 0) {
setTimeout(() => {
if (this.$refs.paginator) {
this.$refs.paginator.goToPage(1)
}
}, 50)
}
}
},
components: {itemHotel, itemHotel2}
})
</script>