Compare commits
5 Commits
161-user-f
...
109-implem
Author | SHA1 | Date | |
---|---|---|---|
e53f74c0f3 | |||
b4bc605943 | |||
7f58c4b68b | |||
9fb3cd745b | |||
a7905624a6 |
@ -542,24 +542,14 @@ impl Album {
|
|||||||
pub fn get_album_data(album_id: i32, conn: &mut PgPooledConn) -> Result<AlbumData, Box<dyn Error>> {
|
pub fn get_album_data(album_id: i32, conn: &mut PgPooledConn) -> Result<AlbumData, Box<dyn Error>> {
|
||||||
use crate::schema::*;
|
use crate::schema::*;
|
||||||
|
|
||||||
let album: Vec<(Album, std::option::Option<Artist>)> = albums::table
|
let artist_list: Vec<Artist> = album_artists::table
|
||||||
.find(album_id)
|
.filter(album_artists::album_id.eq(album_id))
|
||||||
.left_join(songs::table.on(albums::id.nullable().eq(songs::album_id)))
|
.inner_join(artists::table.on(album_artists::artist_id.eq(artists::id)))
|
||||||
.left_join(song_artists::table.inner_join(artists::table).on(songs::id.eq(song_artists::song_id)))
|
.select(
|
||||||
.select((
|
artists::all_columns
|
||||||
albums::all_columns,
|
)
|
||||||
artists::all_columns.nullable()
|
|
||||||
))
|
|
||||||
.distinct()
|
|
||||||
.load(conn)?;
|
.load(conn)?;
|
||||||
|
|
||||||
let mut artist_list: Vec<Artist> = Vec::new();
|
|
||||||
|
|
||||||
for (_, artist) in album {
|
|
||||||
if let Some(artist) = artist {
|
|
||||||
artist_list.push(artist);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Get info of album
|
// Get info of album
|
||||||
let albuminfo = albums::table
|
let albuminfo = albums::table
|
||||||
.filter(albums::id.eq(album_id))
|
.filter(albums::id.eq(album_id))
|
||||||
@ -671,7 +661,7 @@ impl Album {
|
|||||||
|
|
||||||
// Sort the songs by date
|
// Sort the songs by date
|
||||||
let mut songdata: Vec<SongData> = album_songs.into_values().collect();
|
let mut songdata: Vec<SongData> = album_songs.into_values().collect();
|
||||||
songdata.sort_by(|a, b| b.track.cmp(&a.track));
|
songdata.sort_by(|a, b| a.track.cmp(&b.track));
|
||||||
Ok(songdata)
|
Ok(songdata)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ use crate::components::loading::Loading;
|
|||||||
pub fn Login() -> impl IntoView {
|
pub fn Login() -> impl IntoView {
|
||||||
let (username_or_email, set_username_or_email) = create_signal("".to_string());
|
let (username_or_email, set_username_or_email) = create_signal("".to_string());
|
||||||
let (password, set_password) = create_signal("".to_string());
|
let (password, set_password) = create_signal("".to_string());
|
||||||
|
let (two_fa_code, set_two_fa_code) = create_signal("".to_string());
|
||||||
|
|
||||||
let (show_password, set_show_password) = create_signal(false);
|
let (show_password, set_show_password) = create_signal(false);
|
||||||
|
|
||||||
@ -27,6 +28,8 @@ pub fn Login() -> impl IntoView {
|
|||||||
let username_or_email1 = username_or_email.get();
|
let username_or_email1 = username_or_email.get();
|
||||||
let password1 = password.get();
|
let password1 = password.get();
|
||||||
|
|
||||||
|
let two_fa_code1 = two_fa_code.get();
|
||||||
|
|
||||||
spawn_local(async move {
|
spawn_local(async move {
|
||||||
loading.set(true);
|
loading.set(true);
|
||||||
error_msg.set(None);
|
error_msg.set(None);
|
||||||
@ -106,6 +109,16 @@ pub fn Login() -> impl IntoView {
|
|||||||
|
|
||||||
</Show>
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="input-box">
|
||||||
|
<input class="login-2fa" type="text" required
|
||||||
|
on:input = move |ev| {
|
||||||
|
set_two_fa_code(event_target_value(&ev));
|
||||||
|
log!("2FA code changed to: {}", two_fa_code.get());
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<span>2FA Code</span>
|
||||||
|
<i></i>
|
||||||
|
</div>
|
||||||
<a href="" class="forgot-pw">Forgot Password?</a>
|
<a href="" class="forgot-pw">Forgot Password?</a>
|
||||||
<div class="error-msg" >{ move || error_msg.get() }</div>
|
<div class="error-msg" >{ move || error_msg.get() }</div>
|
||||||
<Show
|
<Show
|
||||||
|
Reference in New Issue
Block a user