SAE_RIOT_2024/onzer.riot

261 lines
9.4 KiB
Plaintext
Raw Normal View History

2024-06-20 15:08:44 +02:00
<onzer>
2024-06-20 16:46:54 +02:00
<div class="px-12">
2024-06-21 01:26:39 +02:00
<div class="flex-row mb-2">
<input id="album" type="button" onclick={click} value="Albums"
class="mr-4 border-solid border rounded-lg h-20 w-64 mt-2 {album_style}"/>
<input id="artist" type="button" onclick={click} value="Artists"
class="mr-4 border-solid border rounded-lg h-20 w-64 mt-2 {artist_style}"/>
<input id="song" type="button" onclick={click} value="Songs"
class="mr-4 border-solid border rounded-lg h-20 w-64 mt-2 {song_style}"/>
2024-06-20 15:08:44 +02:00
</div>
2024-06-24 22:42:19 +02:00
2024-06-21 23:05:26 +02:00
<form onsubmit={ add }>
<div class="flex flex-row items-baseline">
2024-06-24 22:42:19 +02:00
<input class="flex-grow-1 border-solid border bg-emerald-100 w-half rounded-lg border-emerald-300 border h-20 pl-6 grow"
placeholder={ state.placeholder } onkeyup={ edit } />
<input type="button" value="Playlists"
class="ml-2 border-solid bg-emerald-300 border rounded-lg border-emerald-600 mb-4 h-20 w-48 mt-2"/>
2024-06-21 23:05:26 +02:00
</div>
</form>
</div>
2024-06-20 15:08:44 +02:00
<div if={ state.items && state.items.length > 0 } class="flex flex-wrap px-12 justify-between mt-8">
<div each={ item in state.items.slice((state.page - 1) * 9, state.page * 9) } class="item mb-4 border border-solid rounded-lg h-64 flex justify-center items-center"
style={ state.search === 'songs' ? 'width: 100%;' : '' }>
<div class="text-center">
<p>{ item.name }</p>
<button if={ state.search === 'songs' } onclick={ () => addSong(item) } class="add-button">Ajouter</button>
</div>
2024-06-21 16:07:05 +02:00
</div>
</div>
<div if={ !state.items || state.items.length === 0 } class="no-results">
<p>Aucun résultat trouvé.</p>
</div>
<div class="pagination">
<button onclick={prevPage} disabled={state.page === 1}>Previous</button>
<span>Page {state.page} of {state.totalPages}</span>
<button onclick={nextPage} disabled={state.page === state.totalPages}>Next</button>
</div>
<!-- Modal pour le formulaire de création de playlist -->
<div class="modal" if={ state.showModal }>
<div class="modal-content">
<span class="close" onclick={ closeModal }>&times;</span>
<playlist-form></playlist-form>
</div>
</div>
2024-06-20 15:08:44 +02:00
<script>
riot.compile().then(() => {
riot.mount('playlist-form');
})
2024-06-20 15:08:44 +02:00
export default {
async onBeforeMount(props) {
let data = await props.items;
2024-06-21 14:48:38 +02:00
this.state = {
placeholder: "Rechercher dans les albums",
items: data.results || [],
2024-06-21 19:31:52 +02:00
search: "albums",
filter: undefined,
id: undefined,
page: 1,
totalPages: Math.ceil((data.results || []).length / 9),
showModal: false,
2024-06-21 14:48:38 +02:00
};
2024-06-21 15:34:27 +02:00
this.paintButton();
2024-06-21 16:37:10 +02:00
this.album_style = "isActivate";
2024-06-21 02:01:15 +02:00
this.update();
2024-06-21 19:31:52 +02:00
},
edit(e) {
2024-06-21 19:42:44 +02:00
this.state.filter = e.target.value;
this.state.page = 1;
2024-06-21 19:42:44 +02:00
this.fetchData();
this.update();
2024-06-20 15:08:44 +02:00
},
click(e) {
e.preventDefault();
this.paintButton();
switch(e.target.value){
case "Albums":
this.state.placeholder = "Rechercher dans les albums";
2024-06-21 14:32:31 +02:00
this.album_style = "isActivate";
this.state.search = "albums";
break;
case "Artists":
this.state.placeholder = "Rechercher dans les artists";
this.artist_style = "isActivate";
this.state.search = "artists";
break;
default:
2024-06-21 17:59:14 +02:00
this.state.placeholder = "Rechercher dans les songs";
2024-06-21 14:32:31 +02:00
this.song_style = "isActivate";
this.state.search = "songs";
}
this.state.page = 1;
this.fetchData();
2024-06-21 16:41:31 +02:00
this.update();
2024-06-21 01:28:13 +02:00
},
2024-06-21 18:37:33 +02:00
async fetchData(){
2024-06-21 19:35:58 +02:00
let data = await this.execQuery(this.state.search, this.state.filter, this.state.id);
this.state.items = data.results || [];
this.state.totalPages = Math.ceil((data.results || []).length / 9);
this.update();
2024-06-21 01:59:44 +02:00
},
async fetchPlaylists() {
try {
const response = await fetch('https://dwarves.iut-fbleau.fr/~fauvet/api/playlists');
if (!response.ok) {
throw new Error('Network response was not ok');
}
const data = await response.json();
console.log('Playlists:', data);
// Utilisez les données des playlists comme nécessaire ici
} catch (error) {
console.error('Error fetching playlists:', error);
}
},
2024-06-21 14:32:31 +02:00
paintButton(){
this.album_style = "isDeactivate";
this.artist_style = "isDeactivate";
this.song_style = "isDeactivate";
2024-06-21 19:35:58 +02:00
},
execQuery(table, filter = undefined, id = undefined){
let baseHttpRequest = "https://dwarves.iut-fbleau.fr/~fauvet/api/";
2024-06-21 19:38:47 +02:00
let computeHttpRequest;
if(filter !== undefined){
switch(table){
case "songs":
computeHttpRequest = baseHttpRequest + table + "?title=" + filter;
2024-06-21 19:48:06 +02:00
break;
2024-06-21 19:38:47 +02:00
default :
computeHttpRequest = baseHttpRequest + table + "?name=" + filter;
2024-06-21 19:38:47 +02:00
}
} else if(id !== undefined) {
computeHttpRequest = baseHttpRequest + table + "/" + id;
2024-06-21 19:38:47 +02:00
} else {
computeHttpRequest = baseHttpRequest + table;
}
return fetch(computeHttpRequest).then(response => response.json());
},
openModal() {
this.state.showModal = true;
this.update();
},
closeModal() {
this.state.showModal = false;
this.update();
},
addSong(item) {
console.log("Ajouter le titre:", item);
// Ajoutez ici le code pour gérer l'ajout du titre à une playlist ou une autre action
this.openModal(); // Appel à openModal pour ouvrir le modal
},
prevPage() {
if (this.state.page > 1) {
this.state.page -= 1;
this.update();
}
},
nextPage() {
if (this.state.page < this.state.totalPages) {
this.state.page += 1;
this.update();
2024-06-21 19:38:47 +02:00
}
}
2024-06-20 15:08:44 +02:00
}
</script>
<style>
2024-06-21 16:37:10 +02:00
.isActivate{
background-color: #6EE7B7;
border-color: #059669;
}
.isDeactivate {
background-color: #D1FAE5;
border-color: #6EE7B7;
}
.item {
background-color: #ECFDF5;
border-color: #6EE7B7;
width: 32%;
}
.item[song] {
width: 100%;
}
.pagination {
display: flex;
justify-content: center;
align-items: center;
margin-top: 16px;
}
.pagination button {
background-color: #6EE7B7;
border: none;
border-radius: 4px;
padding: 8px 16px;
margin: 0 8px;
cursor: pointer;
}
.pagination button:disabled {
background-color: #D1FAE5;
cursor: not-allowed;
}
.add-button {
background-color: #34D399;
border: none;
border-radius: 4px;
padding: 8px 16px;
margin-top: 8px;
cursor: pointer;
color: white;
}
.no-results {
text-align: center;
margin-top: 16px;
font-size: 18px;
color: #6B7280;
}
/* Modal */
.modal {
/*display: none; /* Par défaut, le modal est caché */
position: fixed;
z-index: 10;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgba(0,0,0,0.4); /* Fond semi-transparent pour le modal */
}
.modal-content {
background-color: #fefefe;
margin: 10% auto; /* Centre le modal à l'écran */
padding: 20px;
border: 1px solid #888;
width: 80%;
max-width: 600px;
border-radius: 8px;
position: relative;
}
.close {
position: absolute;
top: 10px;
right: 10px;
font-size: 24px;
font-weight: bold;
cursor: pointer;
color: #888;
}
.close:hover,
.close:focus {
color: #000;
}
</style>
</onzer>