Paginate the homepage

This commit is contained in:
Bat 2018-07-25 15:20:09 +02:00
parent 740393bc18
commit 18125ab398
9 changed files with 50 additions and 5 deletions

View File

@ -65,6 +65,10 @@ impl Post {
.len() .len()
} }
pub fn count(conn: &PgConnection) -> i64 {
posts::table.count().get_result(conn).expect("Couldn't count posts")
}
pub fn get_recents(conn: &PgConnection, limit: i64) -> Vec<Post> { pub fn get_recents(conn: &PgConnection, limit: i64) -> Vec<Post> {
posts::table.order(posts::creation_date.desc()) posts::table.order(posts::creation_date.desc())
.limit(limit) .limit(limit)
@ -106,6 +110,14 @@ impl Post {
.expect("Error loading a page of posts for blog") .expect("Error loading a page of posts for blog")
} }
pub fn get_recents_page(conn: &PgConnection, (min, max): (i32, i32)) -> Vec<Post> {
posts::table.order(posts::creation_date.desc())
.offset(min.into())
.limit((max - min).into())
.load::<Post>(conn)
.expect("Error loading recent posts page")
}
pub fn get_authors(&self, conn: &PgConnection) -> Vec<User> { pub fn get_authors(&self, conn: &PgConnection) -> Vec<User> {
use schema::users; use schema::users;
use schema::post_authors; use schema::post_authors;

View File

@ -345,3 +345,9 @@ msgid "One article in this blog"
msgid_plural "{{ count }} articles in this blog" msgid_plural "{{ count }} articles in this blog"
msgstr[0] "Du bist kein Autor in diesem Blog." msgstr[0] "Du bist kein Autor in diesem Blog."
msgstr[1] "Du bist kein Autor in diesem Blog." msgstr[1] "Du bist kein Autor in diesem Blog."
msgid "Previous page"
msgstr ""
msgid "Next page"
msgstr ""

View File

@ -337,3 +337,9 @@ msgid "One article in this blog"
msgid_plural "{{ count }} articles in this blog" msgid_plural "{{ count }} articles in this blog"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
msgid "Previous page"
msgstr ""
msgid "Next page"
msgstr ""

View File

@ -341,3 +341,9 @@ msgid "One article in this blog"
msgid_plural "{{ count }} articles in this blog" msgid_plural "{{ count }} articles in this blog"
msgstr[0] "{{ count }} aut⋅eur⋅rice dans ce blog : " msgstr[0] "{{ count }} aut⋅eur⋅rice dans ce blog : "
msgstr[1] "{{ count }} aut⋅eur⋅rice⋅s dans ce blog : " msgstr[1] "{{ count }} aut⋅eur⋅rice⋅s dans ce blog : "
msgid "Previous page"
msgstr ""
msgid "Next page"
msgstr ""

View File

@ -350,5 +350,11 @@ msgstr[0] "Ten blog ma jednego autora: "
msgstr[1] "Ten blog ma {{ count }} autorów: " msgstr[1] "Ten blog ma {{ count }} autorów: "
msgstr[2] "Ten blog ma {{ count }} autorów: " msgstr[2] "Ten blog ma {{ count }} autorów: "
msgid "Previous page"
msgstr ""
msgid "Next page"
msgstr ""
#~ msgid "Logowanie" #~ msgid "Logowanie"
#~ msgstr "Zaloguj się" #~ msgstr "Zaloguj się"

View File

@ -46,6 +46,7 @@ fn main() {
routes::comments::create, routes::comments::create,
routes::instance::paginated_index,
routes::instance::index, routes::instance::index,
routes::instance::shared_inbox, routes::instance::shared_inbox,
routes::instance::nodeinfo, routes::instance::nodeinfo,

View File

@ -10,17 +10,20 @@ use plume_models::{
instance::* instance::*
}; };
use inbox::Inbox; use inbox::Inbox;
use routes::Page;
#[get("/")] #[get("/?<page>")]
fn index(conn: DbConn, user: Option<User>) -> Template { fn paginated_index(conn: DbConn, user: Option<User>, page: Page) -> Template {
match Instance::get_local(&*conn) { match Instance::get_local(&*conn) {
Some(inst) => { Some(inst) => {
let recents = Post::get_recents(&*conn, 6); let recents = Post::get_recents_page(&*conn, page.limits());
Template::render("instance/index", json!({ Template::render("instance/index", json!({
"instance": inst, "instance": inst,
"account": user, "account": user,
"recents": recents.into_iter().map(|p| p.to_json(&*conn)).collect::<Vec<serde_json::Value>>() "recents": recents.into_iter().map(|p| p.to_json(&*conn)).collect::<Vec<serde_json::Value>>(),
"page": page.page,
"n_pages": Page::total(Post::count(&*conn) as i32)
})) }))
} }
None => { None => {
@ -31,6 +34,11 @@ fn index(conn: DbConn, user: Option<User>) -> Template {
} }
} }
#[get("/")]
fn index(conn: DbConn, user: Option<User>) -> Template {
paginated_index(conn, user, Page::first())
}
#[post("/inbox", data = "<data>")] #[post("/inbox", data = "<data>")]
fn shared_inbox(conn: DbConn, data: String) -> String { fn shared_inbox(conn: DbConn, data: String) -> String {
let act: serde_json::Value = serde_json::from_str(&data[..]).unwrap(); let act: serde_json::Value = serde_json::from_str(&data[..]).unwrap();

View File

@ -544,7 +544,6 @@ form.new-post input[type="submit"]:hover { background: #DADADA; }
/*== Pagination ==*/ /*== Pagination ==*/
.pagination { .pagination {
display: flex; display: flex;
width: 100%;
justify-content: space-evenly; justify-content: space-evenly;
} }

View File

@ -14,4 +14,5 @@
{{ macros::post_card(article=article) }} {{ macros::post_card(article=article) }}
{% endfor %} {% endfor %}
</div> </div>
{{ macros::paginate(page=page, total=n_pages) }}
{% endblock content %} {% endblock content %}